【问题标题】:Compare two lists in Powershell比较 Powershell 中的两个列表
【发布时间】:2019-04-18 05:18:31
【问题描述】:

我刚刚开始研究 powershell。我有两个分别包含 132 和 134 条记录的列表。它们共有 85 条记录,我想在一个单独的列表中获取 list1 中但不在 list2 中的值,比如 list_out1,而在另一个列表中的 list2 中但不在 list1 中的值是 list_out2。我终于想打印 list_out1 和 list_out2 了。我尝试按照this answer 中给出的方式进行操作,但它在尝试打印 list_out1 时给了我 list1 中的所有值。另外,我尝试使用 foreach 循环和 if 条件如下,它还给了我 list1 中的所有值以打印 list_out1。

foreach ($i in $list1)
{
   if($list2 -notcontains $i) {
      $i
    }
}

我不知道我在哪里做错了。逻辑对我来说似乎没问题。如果我错了,请纠正我。

【问题讨论】:

  • 如果逻辑是正确的,那么你的类型是错误的。它们是什么样的记录?不管是什么,看起来相同的两件事并不能作为同一件事进行比较 - 典型的 PowerShell 初学者错误是想要字符串或整数,但通过执行 get-childitem | select nameget-childitem | ft name 之类的操作而不是更正确的 @ 来获取 PSCustomObjects 987654325@..
  • 您的列表/记录是什么类型的?请注意,两个对象实例被视为不同,即使它们可能具有相同的属性值。
  • @TessellatingHeckler,如果这些列表中的每条记录都有细微的变化,我们应该如何处理,我的意思是,一个列表的值为“ABC”,另一个列表的值为“aB.C”。但我希望我的功能能够同时对待两者。我们如何进行数据清理并执行所需的比较?
  • 或类似这样的数据 $List1 = 'Hello','World2','Today','FromList1' $List2 = 'Hello1','World','Todayi','FromList2' 比较$List1 $list2
  • @Sree 您需要非常清楚“数据清理”的含义。删除数字和标点符号很容易($text -replace '\W') 会做到这一点。PowerShell 在进行比较时会忽略大写/小写,所以没关系。但是 Today 匹配 Todayi 的规则是什么?这已经过去了“数据清理” ” 并进入“拼写检查器”或“具有概率的字典查找”或“自然语言处理魔法”...

标签: powershell scripting powershell-3.0


【解决方案1】:

使用Compare-Object 是您所追求的。假设您执行$List1.Item 或类似的操作。

$MissingGroups = Compare-Object -ReferenceObject ($List1) -DifferenceObject ($List2) -Property Item | Where-Object{$_.sideIndicator -eq "<="}

【讨论】:

    【解决方案2】:

    你是这个意思吗? 如果你只是想要屏幕,只需删除 Out-File 的东西。

    在单独的列表中获取列表 1 中但列表 2 中的值 说 list_out1

    $List1 = 'Hello','World','Today','FromList1'
    $List2 = 'Hello','World','Today','FromList2'
    
    # get the values which are in list1
    ForEach($Item in $List1)
    {
        If($List2 -notcontains $Item)
        {$Item | Out-File -FilePath D:\Temp\ListOne.txt -Append} 
    } 
    
    # Results in the file
    
    FromList1
    

    并且在另一个列表中的 list2 中但不在 list1 中的值说 list_out2.

    ForEach($Item in $List2)
    {
        If($List1 -notcontains $Item)
        {$Item | Out-File -FilePath D:\Temp\ListTwo.txt -Append} 
    } 
    
    # Results in the file
    
    FromList2
    

    【讨论】:

    • 为什么不直接使用 Compare-Object?
    • 没有异议,但 OP 想要将结果提取到两个不同的文件中,并具有单独的结果,而不仅仅是比较。所以,只要按照他们的明确要求接受 OP。
    【解决方案3】:

    我看不出你对自己链接的问答有什么问题。

    使用来自postanote 的好answerCompare-Object 的示例列表

    ## Q:\Test\2018\11\15\SO_53313785.ps1
    $List1 = 'Hello','World','Today','FromList1'
    $List2 = 'Hello','World','Today','FromList2'
    compare $List1 $list2
    

    这会返回(使用别名比较 Copare-Object 并依赖位置参数 1 用于 -ReferenceObject 和 2 用于 -DifferenceObject)

    InputObject SideIndicator
    ----------- -------------
    FromList2   =>
    FromList1   <=
    

    您可以使用SideIndicator 来确定应将输出附加到哪个文件。

    Compare-Object -ReferenceObject $List1 -DifferenceObject $List2 |
        ForEach-Object -Begin {
            Remove-item '.\UniqueToList*.txt'
        } -Process {
           if ($_.SideIndicator -eq '<='){
               Add-Content -Path '.\UniqueToList1.txt' -Value $_.InputObject
           } else {
               Add-Content -Path '.\UniqueToList2.txt' -Value $_.InputObject
           }
        }
    

    如果是更复杂的列表对象,您可以使用 Export-Csv-Append 参数。

    【讨论】:

      猜你喜欢
      • 2019-01-02
      • 1970-01-01
      • 2011-06-19
      • 2013-03-03
      • 2018-03-19
      • 2016-08-24
      • 2016-04-01
      • 1970-01-01
      相关资源
      最近更新 更多