搜索哈希表值缺少值



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

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,即

示例值从$ global。

{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)
}
}

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

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

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

表达式 $hashtable.$key已经解决了用键$key

解决条目的值

$global:hash.$global:computer.values

中删除.values参考

如果这些值只是带有逗号分隔项目的单字符串,则-notcontains无法正常工作,请改用-notlike操作员:

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

最新更新