比较 Powershell 中的变量

Comparing Variables within Powershell

提问人:Dullawolf 提问时间:6/29/2022 最后编辑:M. JustinDullawolf 更新时间:11/15/2023 访问量:160

问:

还行。所以我认为这很容易,但我遇到了一个障碍。

$var = (Get-ItemProperty "HKCU:\SOFTWARE\SAP\General" -Name "BrowserControl")."BrowserControl"
$var2 = "HKCU:\SOFTWARE\SAP\General"
$var3 =  @('1','0')
#if (($var -eq ($var3 -join'')))
#if (Compare-Object -IncludeEqual $var $var3 -SyncWindow 0)
if ($var -eq $var3)
{
    Write-Output "Registry hive exists"
    exit 1
}   
else 
{
    Write-Output "Registry hive doesn't exists"
    #New-ItemProperty -Path $var2 -name "BrowserControl" -Value "1" -PropertyType "DWORD" -Force | Out-Null
    
} 

如果从 BrowserControl 返回 1 或 0,我希望它是匹配的。如果返回任何其他内容,则不匹配。 如果 BrowserControl 设置为 1,则它有效。如果它设置为 0 或 1 以外的任何数字,则它不匹配。 我知道我可以使用else-if并添加更多代码行,但我真的很想让它工作。 如您所见,我尝试了不同的比较方法。我还尝试了 var3 的 (0,1)、('0','1')、0,1。这些都没有奏效。 所以。。。我错过了什么?

PowerShell 变量 相等

评论


答:

2赞 mklement0 6/29/2022 #1

您不能有意义地将数组用作 -eq 运算符的 RHS(右侧)。[1]

但是,PowerShell 具有专用运算符,用于测试给定的单个值是否包含在集合中(更准确地说:等于集合的元素之一),即 -in 及其操作数反转的对应项 -contains

在这种情况下,使代码更具可读性:-in

if ($var -in $var3) # ...

[1] PowerShell 悄悄地接受数组(集合)作为 RHS,但 - 无用 - 通过默认将元素与单个空格连接起来来字符串化它。例如,'1 2' -eq 1, 2 产生 $true
相比之下,使用数组作为 -eq 的 LHS 有意义的支持:然后 RHS 标量充当过滤器,返回相等 LHS 元素的子数组;例如 1, 2, 3, 2 -eq 2 返回 2, 2

评论

0赞 Dullawolf 6/30/2022
谢谢!!我曾经/不知道 RHS/LHS 是什么,但我可以在谷歌上搜索。你的回答是正确的答案,但你已经知道了。
0赞 mklement0 7/1/2022
很高兴听到它,@Dullawolf;别客气。RHS 和 LHS 仅表示“右侧”和“左侧”,指的是二进制(双操作数)中缀运算符(例如在 PowerShell 中)操作数的位置(侧) - 请参阅方程的边维基百科文章。-eq