-1

2つの配列内にいくつかのオブジェクトがあります。各オブジェクトには同じプロパティがあります。

オブジェクトの例:

$obj1 = New-Object System.Object;
$obj1 | Add-Member -Type NoteProperty -Name FirstName 'George'; 
$obj1 | Add-Member -Type NoteProperty -Name LastName 'Banks';
$obj1 | Add-Member -Type NoteProperty -Name EmployeeID '1903'; 

配列:

$array1 = @($obj1,$obj2,$obj3);
$array2 = @($obj5,$obj3,$obj9);

私の目標は、2つの要素に基づいて、各配列の各オブジェクトを1:1の関係で一致させることです。EmployeeIDと一致するか、EmployeeIDが入力されていない場合は、FirstName、LastNameの組み合わせで一致します。

たとえば、次の条件があるとします。

$obj1 = New-Object System.Object;
$obj1 | Add-Member -Type NoteProperty -Name FirstName 'George'; 
$obj1 | Add-Member -Type NoteProperty -Name LastName 'Banks';
$obj1 | Add-Member -Type NoteProperty -Name EmployeeID '1903'; 

$obj2 = New-Object System.Object;
$obj2 | Add-Member -Type NoteProperty -Name FirstName 'Paul'; 
$obj2 | Add-Member -Type NoteProperty -Name LastName 'Newman';
$obj2 | Add-Member -Type NoteProperty -Name EmployeeID '567';

$obj3 = New-Object System.Object;
$obj3 | Add-Member -Type NoteProperty -Name FirstName 'George'; 
$obj3 | Add-Member -Type NoteProperty -Name LastName 'Banks';
$obj3 | Add-Member -Type NoteProperty -Name EmployeeID '1903'; 

$obj4 = New-Object System.Object;
$obj4 | Add-Member -Type NoteProperty -Name FirstName 'Paul'; 
$obj4 | Add-Member -Type NoteProperty -Name LastName 'Newman';
$obj4 | Add-Member -Type NoteProperty -Name EmployeeID '';

$array1 = @($obj1,$obj2);
$array2 = @($obj3,$obj4);

この例では、両方の配列に存在するため、彼のEmployeeIDでGeorgeBanksを照合できます。ただし、PaulNewmanの$array2にはEmployeeIDが入力されていないため、FirstName/LastNameの組み合わせに基づいて彼を照合する必要があります。

最終的には、各オブジェクトのすべてのプロパティを1つのオブジェクトにマージするこのような配列出力を取得したいと思います。

$obj1.FirstName = 'George'
$obj1.LastName = 'Banks'
$obj1.EmployeeID = '1903'
$obj2.FirstName = 'Paul';
$obj2.LastName = 'Newman';
$obj2.EmployeeID = '567'

$aOutput = @($obj1,$obj2);

私がこれをしている現実世界の理由は2つの理由です。

  1. FirstName、LastName、EmployeeID、Departmentの従業員のスプレッドシートがあります。Active Directoryでは、通常、FirstNameとLastNameのみが入力されます。スプレッドシートのデータを取得し、そのユーザーのActiveDirectoryユーザーアカウントに不足しているデータを入力したいと思います。

  2. 何千ものActiveDirectoryユーザーアカウントがありますが、これらは実際の従業員に特に割り当てられておらず、現在は知る方法がありません。このスクリプトは、実際の従業員をそれぞれのActive Directoryユーザーアカウントと照合して、マークを付ける方法を見つけるために必要です。マークが付けられると、そのユーザーアカウントが60日以内に認証されていない場合、そのユーザーアカウントは削除されません。

4

2 に答える 2

0

このようなことをしたいと思います。このコードは、従業員 ID が一致するかどうか、または名と姓の連結が一致するかどうかを確認します。その場合は、配列 1 のオブジェクトの各フィールドをチェックして、空かどうかを確認します。一致する場合は、配列 2 の一致したオブジェクトの対応するフィールドの内容をコピーします。

foreach ($employee1 in $array1) { 
    foreach ($employee2 in $array2) {
        if( ($employee1.EmployeeID -eq $employee2.EmployeeID) -or 
            ("$($employee1.FirstName)$($employee1.LastName)" -eq "$($employee2.FirstName)$($employee2.LastName)")) {
            if ([string]::IsNullOrEmpty($employee1.FirstName)) {
                $employee1.FirstName = $employee2.FirstName
            } elseif ([string]::IsNullOrEmpty($employee1.LastName)) {
                $employee1.LastName = $employee2.LastName
            } elseif ([string]::IsNullOrEmpty($employee1.EmployeeID)) {
                $employee1.EmployeeID = $employee2.EmployeeID
            }       
        } 
    } 
}

考慮すべき点がいくつかあります。

  1. オブジェクトの新しいセットを作成し、変更のサニティ チェックを行ってから、元のオブジェクトをコピーすることができます。
  2. 名と姓を共有する別の人のエントリがある場合、このコードは壊れます。
  3. このコードは、対応するフィールドが両方とも空の場合を考慮していません。
于 2012-07-17T02:21:48.130 に答える
-1

試行錯誤の末、ようやく手に入れることができました。私がやったことは、すべてのオブジェクトプロパティを正規表現文字列に転送し、それに基づいて照合することでした。

于 2012-07-17T22:46:51.953 に答える