4

配列の比較に遭遇した問題を誰かが解決してくれることを期待していました。

ここにいくつかの背景があります。ドメインコントローラーのリストを生成し、それらがオンラインかどうかを確認してから、データをcsvファイルに書き込むpowershellスクリプトがあります。これはうまくいきます。

これを毎週実行し、ドメイン コントローラが追加または削除された場合にアラートを送信したいと考えています。

以前に生成された CSV をアレイにインポートする別のスクリプトがあり、次にドメイン コントローラーの新しいリストを生成し、そのリストを新しいアレイに送信します。比較オブジェクトを使用して 2 つを比較し、相違点のリストを含む新しい 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」、「online」を削除してスクリプトを再度実行してこれをテストすると、リストが変更されたことがわかりますが、新しいエントリは「dc4.testcompany.com」、「online」であると報告されます。 「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」、「online」であり、途中で追加したものではないことが報告されます。

私は自分の比較で何か間違ったことをしているに違いありません。私が使用しているスクリプトの関連部分は次のとおりです。

$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 "xxxx@xxxxxxxx.com" –To "xxxx@xxxxxxxx.com" –Subject "Alert - Domain Controllers Added or Removed" –Body "DC Report Attached" –SmtpServer "smtp.xxxxxxxxxxx.net" -Attachments "DC_Change_List.csv"
    }

誰かアイデアがあれば教えてください!

ありがとうございました!ジョン

4

2 に答える 2

4

によって返されるオブジェクトは、Import-Csv比較を行うべき「実際の」オブジェクトではありません。これらは、動的に生成されるカスタム オブジェクトです。を明示的にチェックすると$newDCArray[0] -eq $oldDCArray[0]、 が返されることに気付くでしょう$false。等価性をチェックするための適切な配管が単に存在しないため、Compare-Objectが正しく機能する見込みはありません。

でも大丈夫です。 Compare-Objectには、-Property指定されたオブジェクトの 1 つ以上の特定のプロパティを確認できるパラメーターがあります。プロパティ実際のオブジェクト (文字列) であるため、比較は機能します。あなたの場合、サーバーが新規/削除されたかどうか、および既知のサーバーがオフラインになったかどうかを知りたいため、DC_Nameとの 2 つのプロパティに関心があります。Ping_Response

これはあなたのために働くはずです:

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

また、-SyncWindow比較が正確になるように が十分に大きいことを確認してください。または、比較する前に単に配列をソートするのが最も簡単な場合があるので、それについて心配する必要はありません。

于 2012-09-17T19:53:31.003 に答える
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 ファイルの列が異なる場合にのみ関連することに注意してください。それ以外の場合は、いずれかのオブジェクトのプロパティを使用できます。

于 2016-11-08T15:18:39.127 に答える