PowerShell脚本If条件判断异常始终返回1的问题排查
代码问题排查
第一版代码核心错误
- 管道逻辑完全错误:你将服务查询的结果通过管道直接传给
Get-ItemProperty,相当于把服务对象当作路径参数传给注册表查询命令,完全无法得到预期的软件安装信息。 - 两个分支都写了
echo "1",无论判断结果如何控制台都会输出1,是你看到结果始终为1的直接原因。
第二版代码核心错误
- 布尔值计数逻辑错误:
@(条件A -and 条件B)中-and返回的是布尔值$true或$false,你将单个布尔值塞进数组统计长度,不管判断结果真假,数组长度永远是1,所以Count -gt 0的条件永远成立,始终走第一个分支。 - 同样存在两个分支都输出1的低级错误。
- 原规则逻辑歧义:你写的规则1
$servicestatus = true和规则2Status -ne "Running"只要服务存在就必然满足其中一条,相当于这部分判断没有实际作用,以下代码默认按你描述的规则实现,你可以根据实际业务需求调整服务判断逻辑。
修复后代码
# 检测目标服务状态,查询不存在的服务时忽略错误 $targetService = Get-Service -Name 'something' -ErrorAction SilentlyContinue # 规则1+2的组合判断,可根据实际需求调整 $serviceMatch = ($null -ne $targetService) -or ($targetService.Status -ne 'Running') # 规则3:检测符合版本要求的软件,版本号转[version]类型避免字符串比较错误 $matchedSoftware = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Select-Object DisplayName, DisplayVersion | Where-Object { $_.DisplayName -like "Crow*" -and [version]$_.DisplayVersion -gt [version]"6.28" } $softwareMatch = @($matchedSoftware).Count -gt 0 # 最终判断 if ($serviceMatch -and $softwareMatch) { Write-Output 1 exit 1 } else { Write-Output 0 exit 0 }
额外注意事项
- 版本号比较必须转成
[version]类型再执行,直接用字符串比较会出现"6.10"<"6.28"的错误结果,因为字符串是逐字符对比ASCII值。 - 32位软件的注册表路径为
HKLM:\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\*,如果需要检测32位程序,需要额外增加该路径的查询逻辑。 - 如果你的规则1实际想表达的是
服务状态等于Running,修改$serviceMatch的判断逻辑为$targetService.Status -eq 'Running'即可。
内容的提问来源于stack exchange,提问作者SmartestVEGA
相关产品推荐
相关产品推荐

