如何判断Compare-Object结果的不同之处?

时间:2013-01-02 21:54:17

标签: powershell compare

给出以下示例代码(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键入所有对象,然后按LengthLastWriteTime进行比较(对于上面的示例)。如果不同,则能够分辨出确切的不同(LengthLastWriteTime或两者),以及具体如何(>,<,=)。是否可以使用内置方式使用Powershell?

1 个答案:

答案 0 :(得分:3)

Compare-Object是一个功能非常强大的cmdlet。它可以经受一些重大改进。我可以将此工作的最佳方法是将删除/添加的文件分成单独的存储桶,然后使用Name而不是FullNameSyncWindow为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参数,你仍然可以获得“正确”的结果,只是文件分散在一起而不是一个在另一个之下。 : - (