Arrays 什么';在Powershell中两个包含对象的数组中查找匹配项的最快方法是什么?

Arrays 什么';在Powershell中两个包含对象的数组中查找匹配项的最快方法是什么?,arrays,object,powershell,active-directory,Arrays,Object,Powershell,Active Directory,我在两个数组中有许多对象。每个对象都具有相同的属性 示例对象: $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 '1

我在两个数组中有许多对象。每个对象都具有相同的属性

示例对象:

$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);
在本例中,我可以在他的EmployeeID上匹配George Banks,因为它存在于两个数组中。但是,Paul Newman没有在$array2中填充EmployeeID,因此我需要根据他的名字/姓氏组合匹配他

最后,我希望得到这样一个数组输出,它将每个对象的所有属性合并到一个对象中

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

$aOutput = @($obj1,$obj2);
现实世界中我这么做的原因有两个

  • 我有一份员工电子表格,上面有名字、姓氏、员工ID、部门。在Active Directory中,通常只填充FirstName和LastName。我想获取电子表格中的数据,并用丢失的数据填充该用户的Active Directory用户帐户

  • 我们有数千个Active Directory用户帐户,这些帐户没有专门分配给实际员工,目前无法知道。我需要这个脚本来找到一种方法,将实际员工与其各自的Active Directory用户帐户进行匹配,以便我们可以标记它。一旦标记,如果该用户帐户在60天内未通过身份验证,则该用户帐户将不会被删除


  • 我想你想做这样的事。此代码检查员工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
                }       
            } 
        } 
    }
    
    需要考虑的几件事:

  • 您可能希望创建一组新的对象,对更改进行完整性检查,然后复制到原始对象上
  • 如果您有共享名字和姓氏的不同人员的条目,则此代码将中断
  • <> LI>此代码不考虑相应字段均为空的情况。
    经过许多考验和磨难,我终于得到了它。我最后做的是将所有对象属性转换为正则表达式字符串,然后根据该字符串进行匹配。

    我认为示例中$obj3的设置中存在复制粘贴错误。此行:
    $obj2 |添加成员-类型NoteProperty-名称EmployeeID“1903”应引用$obj3而不是$obj2。我会对其进行编辑,但该界面需要更改为至少6个字符。您可能需要调整示例,因为所需的输出与输入相同,即obj1和obj2不会更改。虽然这基于输入是有效的,但它并没有说明更改是什么样子。