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

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"
    }
}

代码说明

  1. 注册表访问优化:使用$_.PSPath直接访问注册表项,避免原代码中字符串替换可能导致的路径错误
  2. 值提取与过滤:通过Select-Object -ExpandProperty直接提取版本值,并用Where-Object { $_ }过滤空值,确保结果仅包含有效版本
  3. 去重与分支处理:
    • 用Select-Object -Unique去除重复版本
    • 无版本时提示未找到
    • 单版本时返回该版本值
    • 多版本时输出警告,可扩展写入日志文件

内容的提问来源于stack exchange,提问作者Overw3ightT3chn1cian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:22:40