基于OS版本修改注册表的PowerShell条件判断语句失效问题求助
PowerShell操作系统版本判断失效问题修复方案
核心问题原因
- 版本比较类型错误:
(Get-WmiObject win32_operatingsystem).version返回的是字符串类型,直接用-lt/-gt和数值做比较时,会按照字符串逐字符匹配的规则执行,和版本号的数值比对逻辑完全不一致,导致条件判断永远不生效。 - 注册表逻辑倒置:现有代码判断
AzureADAccount路径存在时才执行新建项操作,会直接抛出「项已存在」的报错,实际应该是路径不存在时才需要新建。 - 路径操作风险:直接用
cd切换注册表路径容易受上下文环境影响,使用完整路径操作稳定性更高。 - 废弃API兼容问题:
Get-WmiObject是PowerShell已废弃的接口,替换为Get-CimInstance兼容性更好。
修复后代码
# 获取系统版本并转换为Version类型用于比对 $verCheckOS = [Version](Get-CimInstance Win32_OperatingSystem).Version # 如需要包含17134、19043两个版本边界,可将-gt/-lt替换为-ge/-le if ($verCheckOS -lt [Version]"10.0.19043" -and $verCheckOS -gt [Version]"10.0.17134") { $regPath = "HKLM:\SOFTWARE\Policies\Microsoft\AzureADAccount" # 路径不存在时创建项,加-Force避免父路径权限问题报错 if (-not (Test-Path $regPath)) { New-Item -Path $regPath -Force | Out-Null } # 设置注册表属性,加-Force避免属性已存在时报错 New-ItemProperty -Path $regPath -Name "AllowPasswordReset" -Value 1 -PropertyType DWord -Force | Out-Null }
注意事项
- 操作HKLM注册表路径需要以管理员身份运行PowerShell,否则会报权限不足错误。
- 若需要包含版本边界(比如等于10.0.17134或者10.0.19043的系统也执行操作),将比较符
-gt替换为-ge、-lt替换为-le即可。
内容的提问来源于stack exchange,提问作者harryc
相关产品推荐
相关产品推荐

