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

PowerShell:如何通过哈希表匹配操作系统名称映射对应标识

解决PowerShell操作系统名称映射自定义标识的问题

你的脚本返回所有哈希表值的原因是Where-Object的语法错误:没有将过滤逻辑包裹在脚本块{}中,导致$_无法正确指代哈希表的每个键,最终匹配条件$os.Caption -like "*$($_)*"变成了匹配空字符串(即所有内容都满足),因此返回了所有键对应的哈希表值。

以下是几种简洁且正确的实现方式:

方式一:修正原脚本的语法问题

$Version = @{
    'Windows 10' = 'WIN10'
    'Windows 11' = 'WIN11'
    'Server 2022' = 'SVR2022'
    'Server 2019' = 'SVR2019'
    'Server 2016' = 'SVR2016'
    'Server 2012' = 'SVR2012'
    'Server 2008' = 'SVR2008'
}

# 使用现代的Get-CimInstance替代已过时的Get-WmiObject
$os = Get-CimInstance Win32_OperatingSystem

# 过滤出匹配的键,取第一个匹配项避免多匹配
$matchedKey = $Version.Keys | Where-Object { $os.Caption -like "*$_*" } | Select-Object -First 1

# 获取对应的自定义标识
$wsusVersion = $Version[$matchedKey]

# 输出结果
$wsusVersion

方式二:遍历哈希表键值对直接取值(更直观)

$Version = @{
    'Windows 10' = 'WIN10'
    'Windows 11' = 'WIN11'
    'Server 2022' = 'SVR2022'
    'Server 2019' = 'SVR2019'
    'Server 2016' = 'SVR2016'
    'Server 2012' = 'SVR2012'
    'Server 2008' = 'SVR2008'
}

$osCaption = (Get-CimInstance Win32_OperatingSystem).Caption

# 遍历哈希表,匹配后直接取出对应值
$wsusVersion = $Version.GetEnumerator() | Where-Object { $osCaption -like "*$($_.Name)*" } | Select-Object -ExpandProperty Value -First 1

# 处理无匹配的情况,设置默认值
if (-not $wsusVersion) {
    $wsusVersion = 'UNKNOWN_OS'
}

$wsusVersion

关键说明:

  • Where-Object脚本块:必须用{}包裹过滤逻辑,确保$_正确绑定到当前遍历的哈希表键/键值对。
  • Select-Object -First 1:避免系统名称同时匹配多个关键词的极端情况(提前防范异常场景)。
  • Get-CimInstance替代Get-WmiObject:后者在PowerShell 5.1及以后版本已被标记为过时,CIM cmdlets是官方推荐的替代方案,兼容性和性能更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:30:16