PowerShell中比较变量判断注册表值匹配异常问题求解
问题原因
你的判断逻辑失效核心是踩了PowerShell比较运算符的两个规则坑:
- 当
-eq运算符的右侧是数组时,它不会返回布尔类型的$true/$false,而是返回数组中与左侧值匹配的所有元素,没有匹配项时才返回$null。 - PowerShell对if判断的条件有隐式布尔转换规则:整数
0、$null、空字符串、空数组会被判定为$false,非0整数、非空字符串会被判定为$true。
这就完美解释了你遇到的现象:
- 当注册表值为整数1时,
$var -eq $var3返回匹配到的整数1,被转换为$true,判断逻辑正常 - 当注册表值为整数0时,
$var -eq $var3返回匹配到的整数0,被转换为$false,判断逻辑走入错误分支 - 你之前尝试字符串数组、Compare-Object等方案,要么没有避开返回值隐式转换的问题,要么没有对齐注册表值的类型(DWORD类型注册表值通过Get-ItemProperty读取后是Int32整数类型,不是字符串),自然无法得到预期结果。
修正方案
判断单个值是否属于指定集合,直接用PowerShell原生的-in运算符即可,这个运算符会固定返回布尔值,不会受隐式类型转换干扰,写法也最简洁。
修正后的完整代码:
$regPath = "HKCU:\SOFTWARE\SAP\General" $regName = "BrowserControl" # 读取注册表值时增加静默错误处理,避免值/项不存在时脚本终止 $var = (Get-ItemProperty $regPath -Name $regName -ErrorAction SilentlyContinue).$regName # 直接定义和DWORD类型匹配的整数数组作为合法值集合 $validValues = 0, 1 if ($var -in $validValues) { Write-Output "Registry hive exists" exit 1 } else { Write-Output "Registry hive doesn't exists" New-ItemProperty -Path $regPath -name $regName -Value "1" -PropertyType "DWORD" -Force | Out-Null }
如果习惯把集合写在判断条件左侧,也可以把判断条件换成if ($validValues -contains $var),效果完全一致。
内容的提问来源于stack exchange,提问作者Dullawolf
相关产品推荐
相关产品推荐

