我正在尝试复制特定的文件类型,例如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 "=>" }
如何将在多个源目录中修改的比较中找到的文件复制到一个目录中?
我在比较中得到的只是文件名和日期修改,我没有参考的路径?
答案 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
一样,你可以随心所欲地做。