2017-06-12 34 views
1

我知道這是不可能的,但我已經管理它。從一個SQL查詢中,我拉取了鏈接到設備的1,2或3個電子郵件地址。我把它們扔進散列表。從那裏開始,我循環查看第二個哈希表,該哈希表由第一個表中的值組成。這適用於有一個電子郵件地址的情況,但如果有多個電子郵件地址,則不會找到匹配項,而是創建一個新密鑰。我有一個散列表中的重複鍵

$DeviceList = @{ 
    "Device1" = "[email protected]"; 
    "Device7" = "[email protected]"; 
    "Device8" = "[email protected]"; 
    "Device2" = "[email protected]", "[email protected]"; 
    "Device3" = "[email protected]", "[email protected]"; 
    "Device4" = "[email protected]", "[email protected]", "[email protected]"; 
    "Device5" = "[email protected]", "[email protected]", "[email protected]"; 
    "Device6" = "[email protected]", "[email protected]", "[email protected]" 
} 
$CompletedDevices = @{} 

foreach ($Device in $DeviceList.GetEnumerator()) { 
    $Devicename = ($Device.Key).ToLower() 
    $OwnerEmail = ($Device.Value).ToLower() 

    if ($CompletedDevices.ContainsKey($OwnerEmail)) { 
     $CompletedDevices.$OwnerEmail += "$Devicename" 
    } else { 
     $CompletedDevices += @{$OwnerEmail = " ", $Devicename} 
    } 
} 

$CompletedDevices 

腳本運行後,如果我只是運行$CompletedDevices += @{$owneremail = " ", $Devicename},它確實給我一個錯誤

項目已添加

,但它不是在ContainsKey()發現它檢查,並且將它添加爲第二或第五十個重複密鑰。

這是最終的結果應該是什麼這個例子:

enter image description here

上面的例子複製的問題。我真的希望我只是俯視一些非常簡單的東西。

+0

你的方法似乎不必要地令人費解。你期望的結果是什麼?你想轉換設備 - >電子郵件地址映射到一個電子郵件地址 - >設備地圖? –

+0

您的代碼不會複製任何問題。我已經運行它,並沒有錯誤。由此產生的散列表是可怕的,但它運行。如果我這樣做,我會創建一個具有設備名稱屬性的自定義PSObject,然後以數組對象的形式通知收件人。然後,您可以使用標準PowerShell cmdlet(其中,選擇,流水線,正則表達式等)完成您需要的任何過濾。 – thepip3r

+0

因此'$ CompletedDevices'應該將電子郵件地址映射到地址發生的設備數量? –

回答

0

MathiasR.Jessen放在評論答案:

「你不會產生重複鍵 - 你複製循環內的數值數組和哈希表將接受由此帶來的對象不按價值,而是由身份密鑰。

$CompletedDevices.GetEnumerator()|%{"$($_.Key): $($_.Key.GetHashCode())" }

變化$OwnerEmail = ($Device.Value).ToLower()$OwnerEmail = "$($Device.Value)".ToLower()

這兩種解決方案對我都有很大幫助,謝謝!

相關問題