2012-07-16 29 views
-1

我有兩個數組內的一些對象。每個對象具有相同的屬性。在兩個包含Powershell中的對象的數組中找到匹配的最快方法是什麼?

實施例目的:

$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); 

我的目標是在一個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); 

在這個例子中,我可以對他的僱員匹配喬治·班克斯,因爲它在兩個數組存在。但是,Paul Newman沒有在$ array2中填充EmployeeID,所以我需要根據他的FirstName/LastName組合來匹配他。

最終,我想得到像這樣的數組輸出,將每個對象的所有屬性合併成一個對象。

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

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

現實世界的原因我這樣做是兩個原因。

  1. 我有一個名字,姓氏,僱員ID,部門僱員的電子表格。在Active Directory中,通常只填寫名字和姓氏。我想獲取電子表格中的數據並使用缺失的數據填充該用戶的Active Directory用戶帳戶。

  2. 我們有成千上萬的活動目錄用戶帳戶沒有明確分配給實際員工,目前無法知道。我需要這個腳本來找到一種方法來將實際員工與他們各自的Active Directory用戶帳戶進行匹配,以便我們可以對此進行標記。標記後,如果該用戶帳戶在60天內未通過身份驗證,則該用戶帳戶不易被刪除。

+0

我認爲在示例中$ obj3的設置中存在複製粘貼錯誤。這一行:'$ obj2 | Add-Member -Type NoteProperty -Name EmployeeID'1903';'應該引用$ obj3而不是$ obj2。我會編輯它,但界面需要更改至少6個字符。 – David 2012-07-17 00:32:27

+0

您可能想調整您的示例,因爲您所需的輸出與您的輸入相同,即obj1和obj2不會更改。雖然這是基於輸入的有效性,但沒有說明變化會是什麼樣子。 – David 2012-07-17 02:23:18

回答

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. 此代碼不會考慮在相應的字段都爲空的情況。
-1

了很多考驗和磨難後,我終於得到了它。我最終做的是將所有對象屬性轉換爲正則表達式字符串,然後根據該字符串進行匹配。

相關問題