提问人:Appleoddity 提问时间:11/14/2023 最后编辑:Appleoddity 更新时间:11/16/2023 访问量:46
PowerShell 查找字符串中包含的哈希表密钥
powershell find which hash table key is contained in a string
问:
我想查询操作系统名称,并将收到如下结果:或 .Microsoft Windows Server 2022 Standard
Microsoft Windows 11 Enterprise
我想将其与任意值相关联,例如: 和SVR2022
WIN11
我尝试使用哈希表来做到这一点,如下所示:
$Version = @{
'Windows 10' = 'WIN10'
'Windows 11' = 'WIN11'
'Server 2022' = 'SVR2022'
'Server 2019' = 'SVR2019'
'Server 2016' = 'SVR2016'
'Server 2012' = 'SVR2012'
'Server 2008' = 'SVR2008'
}
# Collect info
$os = (Get-WmiObject Win32_OperatingSystem)
# Identify OS Version
$wsusVersion = $Version[($Version.Keys | Where-Object $os.Caption -like "*$($_)*")]
这将返回一个包含所有值的集合,因为我相信是 .$_
$null
我尝试了许多不同的代码组合,但很难找到最简洁、最正确的方法。
答:
3赞
Mathias R. Jessen
11/15/2023
#1
如评论中所述,您缺少筛选器表达式周围的括号:{ }
($Version.get_Keys() |Where-Object {$os.Caption -like "*${_}*" })
另一种选择是使用内部方法:.Where({})
($Version.get_Keys().Where({$os.Caption -like "*${_}*"}, 'First')
模式标志将在找到匹配项后立即返回,防止您一次意外解析多个标签。First
.Where({})
如果您有首选顺序,请确保使用有序字典文字而不是哈希表:
$Version = [ordered]@{
'Windows 10' = 'WIN10'
'Windows 11' = 'WIN11'
'Server 2022' = 'SVR2022'
'Server 2019' = 'SVR2019'
'Server 2016' = 'SVR2016'
'Server 2012' = 'SVR2012'
'Server 2008' = 'SVR2012'
}
注意:在上面的示例中,而不是仅仅在上面的示例中使用 instead 是故意的 - PowerShell 的字典适配器更喜欢键映射而不是 .NET 成员,因此,如果不小心用键填充条目,你会得到意外行为:.get_Keys()
.Keys
Keys
PS ~> $table = @{ A = 1; B = 2; C = 3; Keys = @('lol') }
PS ~> $table.Keys # oops
lol
评论
0赞
Appleoddity
11/16/2023
感谢您的解释。
评论
Where-Object {$os.Caption -like "*$($_)*"}
{ }
)