需要将源目录$source
与$dest
进行比较,以查看哪些.wav
文件在源中但不在目标中。我想将那些不在目标中的文件复制到目标AND到第三个目录$sharefolder
。这是我到目前为止所拥有的。似乎copy-item
将所有差异放在一个副本字符串中:
$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 \ blob \ dcbld \ pv-D \ CB \ LD-9 \ 94 \ 1.wav \ isilon1 \ blob \ dcbld \ pv-D \ CB \ LD -9 \ 94 \ 2.wav'因为它不存在。
我来自Unix,所以这对我来说是新的。
答案 0 :(得分:0)
ForEach-Object
的工作原理并不完全。您需要将对象传递给它,它将为您迭代它们。您在上面的行中正确使用了它(%
是ForEach-Object
的别名)。
$diff | ForEach-Object {
Copy-Item "$_" "$comparefolder" -WhatIf
Copy-Item "$_" "$sharefolder" -WhatIf
}
请参阅Get-Help ForEach-Object
。
你也可以使用foreach
语句,它做了类似的事情,但不是一个cmdlet:
foreach ($file in $diff) {
Copy-Item "$file" "$comparefolder" -WhatIf
Copy-Item "$file" "$sharefolder" -WhatIf
}
请参阅Get-Help about_foreach
。
它们的功能略有不同并且有其自身的好处 - foreach
对于小型集合来说速度更快,ForEach-Object
接受来自管道的输入并且能够在它们进入管道后立即流式传输对象 - - 但在这里,他们基本相同。
请注意,Compare-Object
只是比较名称而没有文件和目录对象的路径,据我所知。就像它没有查看文件大小或日期一样,更不用说内容了。这可能对你的需求很好,但它会引发人们,IMX。