我试图搜索一个包含主机名作为键,应用程序作为值的哈希表。我正在寻找不包含特定值AKA应用程序的主机名(键)。但是,我的代码似乎无法工作,因为我总是收到所有的键/主机名。
foreach ($global:computer in $global:hash.keys){
if ($global:hash.$global:computer.values -notcontains 'SnagIt'){
$global:computer
}
}示例数据:
键,值
主机1:FireFox,Chrome,IE
主机2:Snagit,FireFox,Chrome,IE
主机3:Chrome,IE
$global:hash.$global:computer:输出的示例值
{Snagit,FireFox,Chrome,IE.}
哈希表生成代码:
$global:Csv = Import-Csv -LiteralPath $global:ConvertedSNWReport
[HashTable]$global:Hash=@{}
For ($i = 0; $i -lt ($global:Csv."Computer name").Count; $i++)
{
If ($global:Hash.ContainsKey($global:Csv[$i].'Computer name'))
{
$global:Hash.($global:Csv[$i].'Computer name').Application += $global:Csv[$i].Application
Continue
}
$global:Hash.($global:Csv[$i].'Computer name') = @{
Application = @($global:Csv[$i].Application)
}
}发布于 2017-08-30 17:21:18
您的哈希表创建将应用程序列表构建为嵌套哈希表:
{
"Host1": {
"Application": [ "FireFox", "Chrome", "IE" ]
},
"Host2": {
"Application": [ "Snagit", "FireFox", "Chrome", "IE" ]
},
"Host3": {
"Application": [ "Chrome", "IE" ]
}
}像这样导入您的数据:
$hash = @{}
Import-Csv -LiteralPath $global:ConvertedSNWReport | ForEach-Object {
$hash[$_.'Computer name'] += @($_.Application)
}要获得主机名和应用程序列表之间的直接映射:
{
"Host1": [ "FireFox", "Chrome", "IE" ],
"Host2": [ "Snagit", "FireFox", "Chrome", "IE" ],
"Host3": [ "Chrome", "IE" ]
}这样,您就可以像这样过滤哈希表:
$hash.GetEnumerator() | Where-Object {
$_.Value -notcontains 'Snagit'
}如果您想坚持您的数据导入过程(我不推荐),您需要展开哈希表值的Application键:
$hash.GetEnumerator() | Where-Object {
$_.Value.Application -notcontains 'Snagit'
}附带说明:尽可能避免使用全局变量。它们通常是一个在脚本中引入意外状态的侧通道。特别是不要使用全局变量作为循环变量。在大多数情况下,最好使用局部变量并通过脚本/函数参数从调用方传递数据。
发布于 2017-08-30 17:21:06
表达式$hashtable.$key已经解析为带有键$key的条目的值。
从.values中删除$global:hash.$global:computer.values引用
如果值只是带有逗号分隔项的单个字符串,则-notcontains将无法工作,请使用-notlike运算符:
if($hash.$computer -notlike '*SnagIt*'){...}https://stackoverflow.com/questions/45966218
复制相似问题