2016-08-19 1 views
0

У меня есть переменная, которая выглядит следующим образом:Является ли хеш-таблица дальней связи?

Plugin ID  : 66334 
Host   : GCAB-L7-449090L 
Plugin Output : . Microsoft Operating System Patches : 
       + To patch the remote system, you need to install the following Microsoft patches : 
       - KB3167679 (MS16-101) (2 vulnerabilities)The following CVEs would be covered: 
       CVE-2016-3300, CVE-2016-3237 
       - KB3114340 (MS16-099) (133 vulnerabilities)The following CVEs would be covered: 
       CVE-2016-3313, CVE-2016-3315, CVE-2016-3316, CVE-2016-3317, CVE-2016-3318, 
       - KB3115427 (MS16-099) (133 vulnerabilities)The following CVEs would be covered: 
       CVE-2016-3313, CVE-2016-3315, CVE-2016-3316, CVE-2016-3317, CVE-2016-3318 

Plugin ID  : 66334 
Host   : GCAB-L7-449096R 
Plugin Output : . Microsoft Operating System Patches : 
       + To patch the remote system, you need to install the following Microsoft patches : 
       - KB3167679 (MS16-101) (2 vulnerabilities)The following CVEs would be covered: 
       CVE-2016-3300, CVE-2016-3237 
       - KB3177725 (MS16-099) (58 vulnerabilities)The following CVEs would be covered: 
       CVE-2016-3313, CVE-2016-3315, CVE-2016-3316, CVE-2016-3317, CVE-2016-3318

То, что я пытаюсь сделать это массив KBS, содержащих узлы. Я думал, что хеш-таблица - это путь, но если это, я пропустил ключевую часть понимания о них. Вот мой код:

$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.

То, что я хочу, чтобы добраться до это:

KB     Host 

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

Итак, несколько вопросов:

  1. Почему не $hash.ContainsKey() работает для меня здесь?
  2. Является ли хэш-таблицей так, как я хочу?
+3

'ForEach-Object {$ _. Matches}' -> 'ForEach-Object {$ _. Matches} | ForEach-Object {$ _. Value} ' – PetSerAl

+2

Или (в PowerShell 3.0 и новее):' ForEach-Object {$ _. Matches.Value} ' –

ответ

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 или выше) используют member enumeration

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

, чтобы получить фактические значения строки.

+0

Спасибо за объяснение, почему он не работал! Это разочаровывает, что моя проблема связана с отсутствием., Но я все еще очень новичок в Powershell. – Tchotchke