【问题标题】:How can I tell what is different in Compare-Object result?如何判断比较对象结果有什么不同?
【发布时间】:2013-01-02 21:54:17
【问题描述】:

给出以下基于this solution的示例代码(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 键入所有对象,然后通过LengthLastWriteTime 进行比较(对于上面的示例)。如果不同,能够分辨出究竟有什么不同(LengthLastWriteTime 或两者),以及究竟有多不同(>、

【问题讨论】:

    标签: powershell compare


    【解决方案1】:

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

    【讨论】:

    • +1。 SyncWindow 是如何工作的?如果设置为 2,3 等会怎样?我在网上找到的关于它的文档很少。
    • 它应该告诉 PowerShell 多远(如在 Ref/Diff 对象数组的索引中)搜索匹配对象以重新同步。默认值为 [int32]::maxvalue,它提供了一个非常宽的窗口 - 您认为这是最好的。但是从使用 cmdlet 来看,它似乎与较小的同步窗口更匹配。我不确定为什么。 :-(
    • 是的,这正是我的想法,因此提出了问题。看起来 Compare-Object 是 Powershell 中的一大谜团。我将在沙盒环境中使用您的建议,看看它是否适合我的需求。感谢您的努力。
    • 您不应该在比较之前按您的标准对结果进行排序吗?
    • @x0n 试过了,它有一点帮助,但没有多大帮助。我很惊讶它的帮助,因为我有点认为 GCI 会以相同的顺序以基本相同的 dir 结构返回文件。
    猜你喜欢
    • 2019-02-24
    • 2014-02-03
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多