搜索哈希表值缺失值

时间:2017-08-30 17:12:39

标签: powershell hashtable

我正在尝试搜索包含主机名作为键的哈希表,并将应用程序作为值。我正在寻找不包含特定值AKA应用程序的主机名(键)。但是,我的代码似乎不起作用,因为我总是收到所有的键/主机名。

foreach ($global:computer in $global:hash.keys){  
  if ($global:hash.$global:computer.values -notcontains 'SnagIt'){
    $global:computer
}

}

示例数据:

键,值

主机1:火狐,铬,IE

主机2:SnagIt的,火狐,铬,IE

主机3:铬,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)
}
}

2 个答案:

答案 0 :(得分:1)

您的哈希表创建将应用程序列表构建为嵌套哈希表:

{
    "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'
}

作为旁注:尽可能避免使用全局变量。它们通常是在您的脚本中引入意外状态的辅助通道。特别是不要将全局变量用作循环变量。在大多数情况下,最好使用局部变量并通过脚本/函数参数从调用者传递数据。

答案 1 :(得分:0)

表达式$hashtable.$key已经解析为具有键$key

的条目的值

.values

中删除$global:hash.$global:computer.values引用

如果值只是包含逗号分隔项的单个字符串,-notcontains将不起作用,请改用-notlike运算符:

if($hash.$computer -notlike '*SnagIt*'){...}