PowerShell 的 -eq 与比较对象的行为

Behaviour of PowerShell's -eq vs compare-object

为什么 Compare-Object 在 -EQ 无法准确比较字符串数组的情况下按预期工作?

我有一个 PowerShell 脚本,它正在填充一个字符串数组,并使用 -EQ 运算符来测试预期值 - 这总是失败 - 我认为以下代码说明了问题

    # Setting up 4 Lists - $Lists1 2 and 3 should be identical and $List4 differs
    [string[]]$List1  = "AA","BBB"
              $List2  = $List1

    [string[]]$List3  = "AA"
              $List3 += "BBB"

    [string[]]$List4  = $List3
              $List4 += "CCCC"

    "--------"
    "Checking for Equality of the Lists using the -EQ comparison operator (why do all fail--- when only List4 should fail)"
    "--------"
    if ($List1 -eq $List1) {"List 1 and 1 are equal"} else {"List 1 and 1 are NOT equal"}
    if ($List1 -eq $List2) {"List 1 and 2 are equal"} else {"List 1 and 2 are NOT equal"}
    if ($List1 -eq $List3) {"List 1 and 3 are equal"} else {"List 1 and 3 are NOT equal"}
    if ($List1 -eq $List4) {"List 1 and 4 are equal"} else {"List 1 and 4 are NOT equal"}
    ""
    ""
    "--------"
    "Checking using Compare-object (operates as expected - only List4 Differs)"
    "--------"
    if ((compare-object $List1 $List1) -eq $null) {"List 1 and 1 are equal"} else {"List 1 and 1 are NOT equal"}
    if ((compare-object $List1 $List2) -eq $null) {"List 1 and 2 are equal"} else {"List 1 and 2 are NOT equal"}
    if ((compare-object $List1 $List3) -eq $null) {"List 1 and 3 are equal"} else {"List 1 and 3 are NOT equal"}
    if ((compare-object $List1 $List4) -eq $null) {"List 1 and 4 are equal"} else {"List 1 and 4 are NOT equal"}

让我用一个例子向你解释一下:

$a1 = @(1, 2, 3, 4, 5)
$b1 = @(1, 2, 3, 4, 5, 6)
$c = Compare-Object -ReferenceObject (1..5) -DifferenceObject (1..6) -PassThru

$c 将是 6.

这就是比较对象的作用

其中 -EQ 仅检查左侧是否等于右侧。它产生一个布尔值。

例子

$DNS = (Test-Connection www.google.com -quiet)
If($DNS -eq "True") {Write-Host "The Internet is available"}
ElseIf($DNS -ne "True") {Restart-Service dnscache}

摘自 this answer - 这当然值得一读,因为它非常雄辩地解释了你的问题:


当在两个数组变量之间使用 -eq 运算符时,情况有点不同。实际上,PowerShell 只会枚举左侧 的数组,并将每个项目与右侧 的数组作为一个整体 进行比较。结果将是 一个匹配项数组 什么都没有 当没有匹配项时。

Compare-Object 将 return 两个数组之间的 差异数组 $null 当数组相等时。更准确地说,结果数组将包含每个项目的对象,该对象仅存在于一个数组中,而不存在于另一个数组中。