0

我有一个看起来像这样的变量:

插件 ID : 66334
主机:GCAB-L7-449090L
插件输出:. 微软操作系统补丁:
                + 要修补远程系统,您需要安装以下 Microsoft 补丁:
                - KB3167679 (MS16-101)(2 个漏洞)将涵盖以下 CVE:
                CVE-2016-3300、CVE-2016-3237
                - KB3114340 (MS16-099)(133 个漏洞)将涵盖以下 CVE:
                CVE-2016-3313、CVE-2016-3315、CVE-2016-3316、CVE-2016-3317、CVE-2016-3318、
                - KB3115427 (MS16-099)(133 个漏洞)将涵盖以下 CVE:
                CVE-2016-3313、CVE-2016-3315、CVE-2016-3316、CVE-2016-3317、CVE-2016-3318

插件 ID : 66334
主机:GCAB-L7-449096R
插件输出:. 微软操作系统补丁:
                + 要修补远程系统,您需要安装以下 Microsoft 补丁:
                - KB3167679 (MS16-101)(2 个漏洞)将涵盖以下 CVE:
                CVE-2016-3300、CVE-2016-3237
                - KB3177725 (MS16-099)(58 个漏洞)将涵盖以下 CVE:
                CVE-2016-3313、CVE-2016-3315、CVE-2016-3316、CVE-2016-3317、CVE-2016-3318

我想要完成的是包含主机的 KB 数组。我认为哈希表是要走的路,但如果是这样,我就错过了对它们的关键理解。这是我的代码:

$filtered = $data | Where-Object {[string]$_."Plugin ID" -eq "66334"}

foreach ($item in $filtered)
{
    $machine = $item.Host
    $kbs = Select-String -InputObject $item.'Plugin Output' -Pattern $regex -AllMatches |
           ForEach-Object { $_.Matches }

    foreach ($k in $kbs)
    {
        if ($hash.ContainsKey($k))
        {
            #The KB is already a part of the hash table.  Edit the key value to include the new host.
        }
        else
        {
            $hash[$k] = $machine
        }
    }
}

如果密钥不存在,则将其添加到哈希中,否则我将修改现有密钥的值以包含新主机。不幸的是,我的if语句继续只执行 else 子句。

我想要达到的是:

知识库主机

KB3167679 GCAB-L7-449090L, GCAB-L7-449096R
KB3114340 GCAB-L7-449090L
KB3115427 GCAB-L7-449090L
KB3177725 GCAB-L7-449096R

所以,有几个问题:

  1. 为什么不在$hash.ContainsKey()这里为我工作?
  2. 哈希表是我想要的方式吗?
4

1 回答 1

3

是的,哈希表是要走的路。$hash.ContainsKey()对您不起作用,因为您制作$kbs了一个对象列表,MatchInfo而不是将匹配的值扩展为字符串。

正如其他人已经建议的那样,您可以将另一个添加ForEach-Object到您的管道中

$kbs = Select-String -InputObject $item.'Plugin Output' -Pattern $regex -AllMatches |
       ForEach-Object { $_.Matches } | ForEach-Object { $_.Value }

或(如果您有 PowerShell v3 或更新版本)使用成员枚举

$kbs = Select-String -InputObject $item.'Plugin Output' -Pattern $regex -AllMatches |
       ForEach-Object { $_.Matches.Value }

获取实际的字符串值。

于 2016-08-19T22:52:30.560 回答