2015-05-08 2 views
0

Необходимо сравнить исходную директорию $source с номером $dest, чтобы увидеть, какие файлы .wav находятся в исходном коде, но не являются целевыми. Я хочу скопировать те файлы, которые не попадают в цель в целевой И, в третий каталог $sharefolder. Вот что я до сих пор. Оказывается, что copy-item ставит все различия в строке один экземпляр:Powershell - Сравнить исходные и целевые каталоги для файлов .txt. Скопируйте все файлы, которые еще не нацелены на целевой И третий каталог

$sharefolder = '\\isilon1\blob\partial_dictation' 
$comparefolder = '\\isilon1\blob\partial_dictation_compare' 
$source = Get-childitem \\isilon1\blob\dcbld\pv -filter *.wav -recurse 
$dest = Get-ChildItem \\isilon1\blob\Partial_Dictation_Compare -filter *.wav -recurse 
$diff = Compare-Object $dest $source -passthru | Where-Object {$_.SideIndicator -EQ "=>"} | % {$_.FullName} 
ForEach-Object { 
    Copy-Item "$diff" "$comparefolder" -WhatIf 
    Copy-Item "$diff" "$sharefolder" -WhatIf 
} 

Это то, что я получу, если я echo $diff ;

\\isilon1\blob\dcbld\pv\-D\CB\LD\-9\94\1.wav 
\\isilon1\blob\dcbld\pv\-D\CB\LD\-9\94\2.wav 

Это правильно, поскольку эти файлы не по назначению. При выполнении копирования элемент, он дает это:

Copy-Item: Не удается найти путь «\ isilon1 \ блоб \ dcbld \ ру-D \ CB \ LD-9 \ 94 \ 1.wav \ isilon1 \ blob \ dcbld \ pv-D \ CB \ LD-9 \ 94 \ 2.wav ', потому что его не существует.

Я прихожу из Unix, так что это ново для меня.

ответ

0

Это не совсем так, как ForEach-Object работ. Вам нужно передать объекты на него, и он будет проходить через них для вас. Вы правильно использовали строку выше (% - это псевдоним для ForEach-Object).

$diff | ForEach-Object { 
    Copy-Item "$_" "$comparefolder" -WhatIf 
    Copy-Item "$_" "$sharefolder" -WhatIf 
} 

См. Get-Help ForEach-Object.

Вы также можете использовать foreachзаявление, что делает подобную вещь, но не является Командлет:

foreach ($file in $diff) { 
    Copy-Item "$file" "$comparefolder" -WhatIf 
    Copy-Item "$file" "$sharefolder" -WhatIf 
} 

См Get-Help about_foreach.

Они слегка функционируют по-разному и имеют свои преимущества - foreach будучи быстрее для небольших коллекций, а ForEach-Object принимать входные данные из трубы и способен потоковом объекты, как только они попадают в трубу - но здесь они в основном идентичны.

Опасайтесь, что Compare-Object просто сравнивает имя без пути к файлу и объектам каталога, насколько мне известно. Как будто он не смотрит на размер файла или дату, не говоря уже о содержании. Это может быть прекрасно для ваших нужд, но это бросает людей, IMX.

+0

Большое спасибо Bacon Bits ... можете ли вы объяснить, что представляет собой $ _ –

+0

'$ _' - это специальная переменная (см.« Get-Help about_Automatic_Variables », хотя там не так много). Это означает «текущий объект в трубопроводе». Он используется в основном с 'ForEach-Object' и' Where-Object', но это очень распространенные командлеты. –

Смежные вопросы