2016-07-22 39 views
2

おそらくこれを行う簡単な方法がありますが、私はこの時点で数時間壁に頭を打っています。私はADのいくつかのユーザー属性を取得しようとしている、それらの属性の2つを比較し、それらの違いに基づいてそれらを変更します。しかし、いくつかのユーザは自分のオフィスや部門のフィールドでnull値を持っているので、compare-objectが失敗する原因になります。私はnullを取り除くために-replaceを使って他の配列に入っていますので、私の変数は次のようになります:Powershellでの配列の比較

$UserData = Get-ADuser -filter * -properties physicaldeliveryofficename,department | select samaccountname,physicaldeliveryofficename,department 
$Offices = $UserData.physicaldeliveryofficename -replace "^$","N/A" 
$Departments = $UserData.department -replace "^$","N/A" 

これまでのところとても良いですが、ループを通って値を比較すると、問題に遭遇します。このようなユーザーをループすることは、他のすべての要素にすべての要素を比較しているようだ:ループを有し、かつ使用していないが

Foreach ($user in $UserData.samaccountname) { 
Compare-object $offices $departments -includeqeual} 

比較 - オブジェクト自体によっては、正確な結果が得られますが、その後、私がチェックするループを必要とするだろうとにかく試合のために。

私はちょうどオフィスと部門のフィールドが一致する(そしてそれに基づいて、かなり簡単なSet-ADUserコマンドを持つ)ユーザーを特定したいと思うと、他のすべての要素に対してすべての要素をチェックせずに値を比較する方法はありますか?

答えて

2

ForEachループは正しく機能しません。各ユーザーアカウントを経由していても、常に同じオフィスコレクションと部門を比較しているためです。私はこれを書いた方が良い結果を得て、比較結果をオブジェクトの一部として保存し、ユーザーアカウントも見ることができます。

Get-ADuser -Filter * -properties physicaldeliveryofficename,department | ForEach { 
    $Offices = $_.physicaldeliveryofficename -replace "^$","N/A" 
    $Departments = $_.department -replace "^$","N/A" 
    $Results = Compare-object $offices $departments -IncludeEqual 
    [pscustomobject]@{ 
     User = $_.samaccountname 
     compare = $Results 
    } 
} 
+0

チャームのように働いた! –