PowerShell中Get-ChildItem返回重复值,如何处理并验证版本?
解决AnyConnect版本验证中的多重复/多版本问题
问题背景
安装AnyConnect后,需要捕获DisplayVersion验证是否为目标版本,但程序存在多组件,导致在HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall和HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall两个注册表路径中,WOW6432Node下出现两条相同的AnyConnect条目,原代码返回重复的版本值(如4.10.08025 4.10.08025),无法有效验证版本。
需求:
- 若所有返回的版本值相同,合并为单个值
- 若存在多个不同版本值,记录日志提示异常
原代码问题
原代码通过字符串拼接的方式处理版本值,未过滤空值和去重,导致重复值直接拼接成字符串,无法区分重复版本和多版本情况:
$InstallVersion = (Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall),(Get-ChildItem HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall)| foreach { [String](Get-ItemProperty $_.Name.Replace("HKEY_LOCAL_MACHINE","HKLM:") -ErrorAction SilentlyContinue | Where {$_.DisplayName -like '*AnyConnect Secure Mobility Client*'}).DisplayVersion }
修改后的解决方案
以下代码实现版本收集、去重和分支处理:
# 收集所有匹配的DisplayVersion值,过滤空值 $allVersions = @( Get-ChildItem HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall, HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall | ForEach-Object { # 直接使用PSPath访问注册表项,避免字符串替换错误 Get-ItemProperty -Path $_.PSPath -ErrorAction SilentlyContinue | Where-Object { $_.DisplayName -like '*AnyConnect Secure Mobility Client*' } | Select-Object -ExpandProperty DisplayVersion -ErrorAction SilentlyContinue } ) | Where-Object { $_ } # 过滤空值,排除无效条目 # 根据版本数量分支处理 if (-not $allVersions) { Write-Host "未找到AnyConnect Secure Mobility Client的安装记录" } else { # 去重获取唯一版本集合 $uniqueVersions = $allVersions | Select-Object -Unique if ($uniqueVersions.Count -eq 1) { $InstallVersion = $uniqueVersions[0] Write-Host "检测到唯一版本: $InstallVersion" } else { $versionList = $uniqueVersions -join ', ' Write-Warning "发现多个不同版本: $versionList" # 可添加日志写入逻辑,示例: # Add-Content -Path "C:\AnyConnect_Install_Log.txt" -Value "[$(Get-Date)] 检测到多个AnyConnect版本: $versionList" } }
代码说明
- 注册表访问优化:使用
$_.PSPath直接访问注册表项,避免原代码中字符串替换可能导致的路径错误 - 值提取与过滤:通过
Select-Object -ExpandProperty直接提取版本值,并用Where-Object { $_ }过滤空值,确保结果仅包含有效版本 - 去重与分支处理:
- 用
Select-Object -Unique去除重复版本 - 无版本时提示未找到
- 单版本时返回该版本值
- 多版本时输出警告,可扩展写入日志文件
- 用
内容的提问来源于stack exchange,提问作者Overw3ightT3chn1cian
相关产品推荐
相关产品推荐

