使用PowerShell以递归方式比较和复制某种类型的文件

时间:2014-10-25 22:21:03

标签: powershell

我正在尝试复制特定的文件类型,例如foo.pbo。这些pbo分散在源文件夹下的许多子目录中。在目的地,它是一个文件夹,下面有一个子目录。

我使用powershell将源文件夹和子目录与.pbo扩展名的文件与目标文件夹进行比较,但这里只是复制更新的文件。

我试过把它分解,所以这是我的尝试。

$s = Get-ChildItem .\mods -filter *pbo -Recurse
$d = Get-ChildItem .\updates\addons -filter *pbo

Compare-Object -ReferenceObject $s -DifferenceObject $d -Property Name, LastWriteTime | Where-Object { $_.SideIndicator -eq "=>" }

如何将在多个源目录中修改的比较中找到的文件复制到一个目录中?

我在比较中得到的只是文件名和日期修改,我没有参考的路径?

2 个答案:

答案 0 :(得分:3)

我认为Compare-Object是错误的工具。它比较了属性的存在 - 你无法指定它应该比较日期。

我建议使用foreach循环遍历每个源对象并检查是否需要复制它。

$s = Get-ChildItem .\source -Filter *.txt -Recurse
$d = Get-ChildItem .\dest -Filter *.txt

foreach ($file in $s) {
    $targetFile = $d | where Name -eq $file.Name

    # this copies files which do not exist in the target
    if ($file.LastWriteTime -gt $targetFile.LastWriteTime) {
        Copy-Item $file.FullName .\dest
    }

    # this copies only files which exist in the target
    if ($targetFile -and $file.LastWriteTime -gt $targetFile.LastWriteTime) {
        Copy-Item $file.FullName .\dest
    }
}

答案 1 :(得分:0)

假设Compare-Object工作正常,您寻找的数据位于InputObject注释属性中。在Where-Object管道末尾Select-Object

Where-Object { $_.SideIndicator -eq "=>" } | Select-Object -ExpandProperty InputObject

这将返回System.IO.FileInfo对象,就像Get-ChildItem一样,你可以随心所欲地做。