Powershell - 比较.txt文件的源目录和目标目录。将目标中尚未定位的所有文件复制到目标和第三个目录

时间:2015-05-08 12:44:28

标签: powershell

需要将源目录$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,所以这对我来说是新的。

1 个答案:

答案 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。