提问人:Dullawolf 提问时间:6/29/2022 最后编辑:M. JustinDullawolf 更新时间:11/15/2023 访问量:160
比较 Powershell 中的变量
Comparing Variables within Powershell
问:
还行。所以我认为这很容易,但我遇到了一个障碍。
$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。这些都没有奏效。 所以。。。我错过了什么?
答:
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
评论