PowerShell 查找字符串中包含的哈希表密钥

powershell find which hash table key is contained in a string

提问人:Appleoddity 提问时间:11/14/2023 最后编辑:Appleoddity 更新时间:11/16/2023 访问量:46

问:

我想查询操作系统名称,并将收到如下结果:或 .Microsoft Windows Server 2022 StandardMicrosoft Windows 11 Enterprise

我想将其与任意值相关联,例如: 和SVR2022WIN11

我尝试使用哈希表来做到这一点,如下所示:

$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

我尝试了许多不同的代码组合,但很难找到最简洁、最正确的方法。

PowerShell 哈希表

评论

2赞 Mathias R. Jessen 11/14/2023
你想要(缺失Where-Object {$os.Caption -like "*$($_)*"}{ })
0赞 Appleoddity 11/15/2023
哦,哎呀。面对掌心时刻。如此专注于结果,我错过了树木的森林。是的,这解决了它。谢谢。

答:

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().KeysKeys

PS ~> $table = @{ A = 1; B = 2; C = 3; Keys = @('lol') }
PS ~> $table.Keys     # oops
lol

评论

0赞 Appleoddity 11/16/2023
感谢您的解释。