PowerShell脚本验证软件版本≥指定版本失效问题求解
PowerShell验证Bitdefender版本不低于指定值的修正方案
问题场景
原本用PowerShell脚本通过注册表卸载项匹配指定版本的Bitdefender Endpoint Security Tools(7.8.1.244)时,-eq运算符能正常工作,但换成-ge验证版本不低于指定值后,脚本会误判所有情况为已安装。
原-eq版本脚本:
$software = "Bitdefender Endpoint Security Tools"; $version = "7.8.1.244" $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where { $_.DisplayVersion -eq $version }) -ne $null If(-Not $installed) { Write-Host "'$software' is NOT installed."; } else { Write-Host "'$software' is installed." }
尝试的-ge版本脚本(存在误判):
$software = "Bitdefender Endpoint Security Tools"; $version = "7.8.1.244" $installed = (Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where { $_.DisplayVersion -ge $version }) -ne $null If(-Not $installed) { Write-Host "'$software' is NOT installed."; } else { Write-Host "'$software' is installed." }
问题原因
DisplayVersion是字符串类型,直接用-ge做字符串比较时,是按字符的ASCII码逐个比对,不是按照版本号的逻辑(主版本>次版本>修订版本)来比较。比如字符串"10.0.0.0"会被判定为小于"7.8.1.244",因为第一个字符'1'的ASCII码小于'7',这和实际版本逻辑完全相反,导致误判。
修正方案
把版本字符串转换成PowerShell的[Version]类型后再进行比较,同时先过滤出目标软件的卸载项,避免无关项干扰:
$software = "Bitdefender Endpoint Security Tools" $targetVersion = [Version]"7.8.1.244" # 先过滤出目标软件的卸载项,再转换版本进行比较 $installed = Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object { $_.DisplayName -eq $software -and $_.DisplayVersion } | ForEach-Object { [Version]$_.DisplayVersion } | Where-Object { $_ -ge $targetVersion } | Select-Object -First 1 if ($installed) { Write-Host "'$software' 已安装,版本不低于 $targetVersion" } else { Write-Host "'$software' 未安装,或版本低于 $targetVersion" }
修正点说明
- 先通过
DisplayName精准定位目标软件的卸载项,避免其他软件的版本字符串干扰判断 - 将
DisplayVersion和目标版本都转为[Version]类型,确保按版本号逻辑比较 - 用
Select-Object -First 1找到符合条件的项后就停止遍历,提升效率 - 优化输出信息,明确告知版本状态
内容的提问来源于stack exchange,提问作者Midwest Cloud
相关产品推荐
相关产品推荐

