0

给定以下基于此解决方案的示例代码(Powershell) :

$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然后比较(对于上面的例子)。如果不同,能够分辨出究竟是什么不同(或两者兼而有之),以及究竟有多不同(>、<、=)。Powershell是否可以使用内置方式?LengthLastWriteTimeLengthLastWriteTime

4

1 回答 1

3

Compare-Object是一个功能非常简单的 cmdlet。它可以承受一些严重的改进。我可以让它工作的最好方法是将删除/添加的文件拼凑到一个单独的存储桶中,然后使用NamenotFullNameSyncWindow1 比较相同的文件,例如:

$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 参数,您仍然会得到“正确”的结果,只是文件分散在其他地方,而不是一个接一个地排列。:-(

于 2013-01-02T22:42:20.840 回答