2015-05-08 51 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 

這是正確的。當複製項目運行時,它給出了這樣的:

拷貝項目:找不到路徑「\ isilon1 \斑點\ dcbld \ PV-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

非常感謝你培根位......你能解釋一下$ _代表什麼 –

+0

'$ _'是一個特殊的變量(參見'Get-Help about_Automatic_Variables',雖然這裏沒有太多的介紹)。它意味着「管道中的當前物體」。它主要用於'ForEach-Object'和'Where-Object',但這些都是非常常見的小命令。 –

相關問題