Войти

Показать полную графическую версию : [решено] Поиск файлов из списка


Frenzy
01-12-2010, 15:19
Только недавно начал изучать powershell поэтому решаю задачи в силу своих знаний.

Подскажите как мне реализовать следующую задачу.

Есть файл CSV в котором есть названия файлов (по одному на каждую стоку) и эти файлы надо найти в куче подпапок.

Я вижу решение этой задачи следующим образом


Читаем содержимое файла | foreach-object { Ищем каждый объект в подпапках | копируем файлы в нужное место }

Начал делать и сразу же столкнулся с проблемой.

cat patch\file.csv | foreach (get-childitem d:\folder\ -include $_ -recurse)

Получаю ошибку

ForEach-Object : Не удается преобразовать "System.Object[ ]" в тип "System.Management.Automation.ScriptBlock", необходимый для параметра "Process". Specified method is not supported

Подскажите каким образом можно по конвееру передать строки из файла (если знаете уже готовые решения по такому вопросу - будит вообще замечательно)

Frenzy
01-12-2010, 17:51
Разобрался надо было всего лишь поставить после foreach "- process"

Вот что получилось (содержимое файла ps1)

cat ..\compare.csv |
foreach -Process{get-childitem G:\CheckData\zakupka\ -include $_ -recurse |
foreach -process {copy-item $_ G:\CheckData\zakupka_2\}
}

1я строка - считываем информацию из файла
2я строка - ищим файлы в нужной папке (и подпапках)
3я строка - копируем эти файлы в нужную папку

*Есть минус - если находит более одного экземпляра файла - второй не будет копировать (и выдаст ошибку, что файл уже существует)

tarasov.evgeny
01-12-2010, 18:21
Добрый день,

Frenzy, тоже недавно изучаю Powershell

$read = Get-Content .\test.csv
$conv = Out-String -InputObject $read -Stream
ForEach ($Str in $conv){
IF ( Get-ChildItem ".\$str" | Where-Object { $_.exists -eq "true"})
{Copy-Item -Path ".\$Str" -destination "C:\Documents...\PS\Destination"}
else {"Файла не существует"}}


Тоже не идеал...если файла не существует, то прерывается цикл...
Нужно бежать на электричку, завтра-после завтра посмотрю

Frenzy, может файл в новое место переименовывать?
староеимя_дата_время_копирования? - тогда точно будут разные файлы




© OSzone.net 2001-2012