【问题标题】:PowerShell Compare-Object SideIndicatorPowerShell 比较对象 SideIndicator
【发布时间】:2019-04-21 01:34:05
【问题描述】:

PowerShell 比较对象 SideIndicator

我有这段代码,它的输出不是预期的

Compare-Object $(Get-Content c:\Folder\List1.txt) $(Get-Content 
c:\Folder\List2.txt) | 

Out-File C:\Folder\filename.txt 

我只想获得“=> SideIndicator”值,而不是两者。即list2有什么不同

【问题讨论】:

    标签: windows shell powershell


    【解决方案1】:

    使用Where-Object cmdlet 按SideIndicator 属性过滤(PSv3+ 语法):

    Compare-Object (Get-Content c:\Folder\List1.txt) (Get-Content c:\Folder\List2.txt) | 
      Where-Object SideIndicator -eq '=>' | 
        Out-File C:\Folder\filename.txt 
    

    还要注意(...) 足以提供单个命令或表达式作为参数 - 不需要$(...)

    注意:

    • => 过滤仅输出 RHS (-DifferenceObject) 集合独有的那些行; SideIndicator 属性值(它是一个字符串)指向给定对象唯一的集合方向(假设位置参数传递):

      • <= ... LHS 独有(隐含 -ReferenceObject 参数)
      • => ... RHS 独有(隐含 -DifferenceObject 参数)
      • == ... 出现在两个集合中(仅限-IncludeEqual
    • 然而,在输出Compare-Object 包装 默认情况下,即在具有.SideIndicator 属性和.InputObject 属性的自定义对象中,后者包含原始输入对象,这会产生如下输出:

      InputObject                   SideIndicator
      -----------                   -------------
      unique line 1 from List2.txt  =>
      unique line 2 from List2.txt  =>
      
    • 只保存输出文件中的行,请将-PassThru 开关添加到Compare-Object 调用中。

      • 注意:.SideIndicator 属性过滤在这种情况下仍然有效的原因是,使用 PowerShell 的 ETS (Extended Type System)-PassThru 使用此属性装饰原始对象。 p>

      • 对于字符串,当它们被保存到文件时,这个额外的属性会被忽略,例如Out-File;但是,在其他情况下,它可能会浮出水面;为了防止这种情况:

        • 不要不要使用-PassThru
        • 添加一个额外的管道段,将Where-Object 输出通过管道传送到
          ForEach-Object InputObject,后者输出未修饰的原始对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-06
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多