给出以下示例代码(Powershell),它基于this solution:
$newFiles = @(Get-ChildItem -recurse -path "c:\path1");
$oldFiles = @(Get-ChildItem -recurse -path "c:\path2");
Compare-Object -ReferenceObject $newFiles -DifferenceObject $oldFiles -Property FullName,Length,LastWriteTime
我有SideIndicator
来判断任何一方是否存在具有相同属性集的对象。但这通常用于生产目的。我真正需要的是通过FullName
键入所有对象,然后按Length
和LastWriteTime
进行比较(对于上面的示例)。如果不同,则能够分辨出确切的不同(Length
或LastWriteTime
或两者),以及具体如何(>,<,=)。是否可以使用内置方式使用Powershell?
答案 0 :(得分:3)
Compare-Object
是一个功能非常强大的cmdlet。它可以经受一些重大改进。我可以将此工作的最佳方法是将删除/添加的文件分成单独的存储桶,然后使用Name
而不是FullName
与SyncWindow
为1来比较相同的文件例如:
$removed = Compare-Object -ReferenceObject $oldFiles -DifferenceObject $newFiles -Property Name -PassThru | Where {$_.SideIndicator -eq '<='}
$added = Compare-Object -ReferenceObject $oldFiles -DifferenceObject $newFiles -Property Name -PassThru | Where {$_.SideIndicator -eq '=>'}
$removedNames = $removed | Foreach {$_.Fullname}
$same = $oldFiles | Where {$_.Fullname -notin $removedNames}
Compare-Object -ReferenceObject $same -DifferenceObject $newFiles -Property Name,Length,LastWriteTime -SyncWindow 1
这给了我这样的结果:
Name Length LastWriteTime SideIndicator
---- ------ ------------- -------------
AssemblyInfo.Shared.cs 340 8/28/2012 1:21:53 AM =>
AssemblyInfo.Shared.cs 340 8/28/2012 1:21:28 AM <=
EchoArgs.cs 825 8/28/2012 1:21:54 AM =>
EchoArgs.cs 825 8/28/2012 1:21:30 AM <=
AssemblyInfo.cs 151 8/28/2012 1:21:54 AM =>
AssemblyInfo.cs 151 8/28/2012 1:21:31 AM <=
即便如此,在列表中的部分文件也会不同步。去搞清楚。如果你消除了SyncWindow参数,你仍然可以获得“正确”的结果,只是文件分散在一起而不是一个在另一个之下。 : - (