You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:48:02