2012-09-17 57 views
4

我希望有人能夠幫助解決我在比較數組時遇到的問題。Powershell - 比較兩個數組返回錯誤結果

這是一些背景。我有一個PowerShell腳本,它生成一個域控制器列表,檢查它們是否在線,然後將數據寫入一個csv文件。這工作正常。

我要運行該週刊,如果任何域控制器中添加或刪除發送警報。

我還有一個腳本,該腳本導入先前生成CSV到一個數組,然後我生成的域控制器的一個新的列表,併發送該列表到一個新的數組。我試圖比較兩個使用比較對象,並導出一個新的CSV與差異列表。

但是,我正在通過手動修改舊的CSV來測試這一點,並且我發現無論我從以前的列表中刪除哪個域控制器或添加新的域控制器,它總是會報告更改是列表中的最後一個域控制器。

例如,這裏就是我的CSV文件看起來像:

"DC_Name","Ping_Response" 
"dc1.testcompany.com","online" 
"dc2.testcompany.com","online" 
"dc3.testcompany.com","online" 
"dc4.testcompany.com","online" 

如果我刪除測試這個「dc3.testcompany.com」,「在線」並再次運行該腳本,它知道名單已更改,但報告新條目是「dc4.testcompany.com」,「在線」而不是「dc3.testcompany.com」,「在線」。

同樣,如果我改變我的老CSV看起來像這樣:

"DC_Name","Ping_Response" 
"dc1.testcompany.com","online" 
"dc2.testcompany.com","online" 
"dc5.testcompany.com","online" 
"dc3.testcompany.com","online" 
"dc4.testcompany.com","online" 

它會報告一個不同於新名單「dc4.testcompany.com」,「在線」,不是我在中間添加的那個。

我必須做一些錯誤與我相比。這裏是我正在使用的腳本的相關部分:

$newDCArray = @(Import-CSV DC_List.csv) 

$oldDCArray = @(Import-CSV Last_DC_List.csv) 

$diff = Compare-Object $oldDCArray $newDCArray 

if($diff -eq $null) 
    { 
    Write-Host "No changes to DCs" 
    } 
else  
    { 
    Write-Host "There have been changes to DCs" 
    $diff| Export-CSV DC_Change_List.csv -notypeinformation 
    Send-MailMessage –From "[email protected]" –To "[email protected]" –Subject "Alert - Domain Controllers Added or Removed" –Body "DC Report Attached" –SmtpServer "smtp.xxxxxxxxxxx.net" -Attachments "DC_Change_List.csv" 
    } 

請讓我知道如果有人有任何想法!

謝謝! 約翰

回答

4

Import-Csv返回的對象不是「真正的」對象,你應該與之比較。它們是動態生成的自定義對象。你會注意到,如果你做了明確的檢查$newDCArray[0] -eq $oldDCArray[0],它將返回$false。由於檢查平等的適當管道根本不存在,Compare-Object沒有希望正常工作。

雖然沒關係。 Compare-Object有一個-Property參數,它允許您查看給定對象的1個或多個特定屬性。屬性真實對象(字符串),所以比較起作用。在你的情況下,你有兩個屬性感興趣 - DC_NamePing_Response,因爲你想知道一個服務器是新的/刪除,以及如果一個已知的服務器已經離線。

這應該爲你工作:

Compare-Object $oldDCArray $newDCArray -Property 'DC_Name','Ping_Response' 

同時,確保-SyncWindow足夠大,這樣比較準確。或者在比較之前簡單地對數組進行排序是最容易的,所以您不必擔心這一點。

+0

即將發佈! – SpellingD

+0

謝謝! -property參數正是我所缺少的,現在這個工作非常棒! – user1678436

0

這裏是公認的答案自動確定的屬性的版本:

$newDCArray = Import-CSV DC_List.csv 
$oldDCArray = Import-CSV Last_DC_List.csv 

$propNew = ($newDCArray | Get-Member | ?{$_.MemberType -eq "NoteProperty" | Select -expand Name}) 
$propOld = ($oldDCArray | Get-Member | ?{$_.MemberType -eq "NoteProperty" | Select -expand Name}) 
$prop = ($propNew + $propOld) | Get-Unique 

$diff = Compare-Object $oldDCArray $newDCArray -Property $prop 

注意Get-Unique東西,它執行不同的聯盟,只有當CSV-文件的列不同有關。否則,您可以使用任何一個對象的屬性。