PowerShell中引用带空格的注册表属性并进行版本校验问题
解决PowerShell检查注册表带空格属性值的匹配问题
需求:检查注册表项
HKLM:\software\dg下的“Agent version”属性值,若为7.8.5.005则输出提示,否则创建名为“Test”、值为0的属性。原脚本因类型不匹配等问题,始终执行创建分支。
核心问题分析
- 注册表中的“Agent version”值通常为字符串类型(REG_SZ),原脚本直接用数字字面量
7.8.5.005比较,会因类型不匹配导致判断失败(PowerShell会将数字7.8.5.005解析为7.8.5.5,与字符串"7.8.5.005"不相等)。 - 64位系统中,若Agent是32位程序,其写入的注册表项会被重定向到
HKLM:\Software\Wow6432Node\dg,原路径无法访问正确值。 - 未检查属性是否存在,若“Agent version”不存在,
$val.'Agent version'为$null,直接进入else分支。
基础修正版(解决类型匹配问题)
$regPath = "HKLM:\software\dg" $val = Get-ItemProperty -Path $regPath # 用字符串类型匹配版本号,必须加引号 if ($val.'Agent version' -eq "7.8.5.005") { Write-Host "Agent is current" -ForegroundColor Green } else { # 仅当Test属性不存在时创建,避免重复操作 if (-not (Get-ItemProperty -Path $regPath -Name "Test" -ErrorAction SilentlyContinue)) { New-ItemProperty -Path $regPath -Name "Test" -Value 0 -PropertyType DWord -Force } }
完整适配版(处理32位/64位注册表重定向)
如果你的Agent是32位程序,在64位系统上需指定注册表视图:
$regPath = "HKLM:\software\dg" # 根据Agent位数选择Registry32或Registry64 $val = Get-ItemProperty -Path $regPath -RegistryView Registry32 if ($val.'Agent version' -eq "7.8.5.005") { Write-Host "Agent is current" -ForegroundColor Green } else { if (-not (Get-ItemProperty -Path $regPath -Name "Test" -RegistryView Registry32 -ErrorAction SilentlyContinue)) { New-ItemProperty -Path $regPath -Name "Test" -Value 0 -PropertyType DWord -Force -RegistryView Registry32 } }
关键要点说明
- 字符串匹配:将版本号用双引号包裹,确保和注册表中的字符串值类型一致,避免隐式转换导致的匹配失败。
- 注册表视图:使用
-RegistryView参数指定访问32位或64位注册表 hive,解决重定向问题。 - 避免重复创建:添加判断逻辑,仅当“Test”属性不存在时才创建,防止重复执行脚本时多次生成该属性。
- 属性类型指定:创建“Test”属性时加上
-PropertyType DWord(适用于数值类型需求),默认类型为REG_SZ,可根据实际需求调整。
内容的提问来源于stack exchange,提问作者mannyfresh86
相关产品推荐
相关产品推荐

