首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >搜索哈希表值以查找缺失的值

搜索哈希表值以查找缺失的值
EN

Stack Overflow用户
提问于 2017-08-30 17:12:39
回答 2查看 479关注 0票数 0

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

代码语言:javascript
复制
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.}

哈希表生成代码:

代码语言:javascript
复制
$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)
}
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-08-30 17:21:18

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

代码语言:javascript
复制
{
    "Host1": {
        "Application": [ "FireFox", "Chrome", "IE" ]
    },
    "Host2": {
        "Application": [ "Snagit", "FireFox", "Chrome", "IE" ]
    },
    "Host3": {
        "Application": [ "Chrome", "IE" ]
    }
}

像这样导入您的数据:

代码语言:javascript
复制
$hash = @{}
Import-Csv -LiteralPath $global:ConvertedSNWReport | ForEach-Object {
    $hash[$_.'Computer name'] += @($_.Application)
}

要获得主机名和应用程序列表之间的直接映射:

代码语言:javascript
复制
{
    "Host1": [ "FireFox", "Chrome", "IE" ],
    "Host2": [ "Snagit", "FireFox", "Chrome", "IE" ],
    "Host3": [ "Chrome", "IE" ]
}

这样,您就可以像这样过滤哈希表:

代码语言:javascript
复制
$hash.GetEnumerator() | Where-Object {
    $_.Value -notcontains 'Snagit'
}

如果您想坚持您的数据导入过程(我不推荐),您需要展开哈希表值的Application键:

代码语言:javascript
复制
$hash.GetEnumerator() | Where-Object {
    $_.Value.Application -notcontains 'Snagit'
}

附带说明:尽可能避免使用全局变量。它们通常是一个在脚本中引入意外状态的侧通道。特别是不要使用全局变量作为循环变量。在大多数情况下,最好使用局部变量并通过脚本/函数参数从调用方传递数据。

票数 1
EN

Stack Overflow用户

发布于 2017-08-30 17:21:06

表达式$hashtable.$key已经解析为带有键$key的条目的值。

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

如果值只是带有逗号分隔项的单个字符串,则-notcontains将无法工作,请使用-notlike运算符:

代码语言:javascript
复制
if($hash.$computer -notlike '*SnagIt*'){...}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45966218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档