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
相关产品推荐
相关产品推荐

