我在两个数组中有很多对象。每个对象都具有相同的属性。
示例对象:
$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,因此我需要根据他的FirstName / LastName组合匹配他。
最终,我希望得到一个这样的数组输出,将每个对象的所有属性合并为一个对象。
$obj1.FirstName = 'George'
$obj1.LastName = 'Banks'
$obj1.EmployeeID = '1903'
$obj2.FirstName = 'Paul';
$obj2.LastName = 'Newman';
$obj2.EmployeeID = '567'
$aOutput = @($obj1,$obj2);
现实世界的原因我这样做有两个原因。
我有一个员工的电子表格,其中包含FirstName,LastName,EmployeeID,Department。在Active Directory中,通常只填充FirstName和LastName。我想获取电子表格中的数据,并使用缺少的数据填充该用户的Active Directory用户帐户。
我们有数千个未专门分配给实际员工的Active Directory用户帐户,目前无法知道。我需要这个脚本来找到一种方法来匹配实际员工与他们各自的Active Directory用户帐户,以便我们对此进行标记。标记后,如果该用户帐户在60天内未经过身份验证,则该用户帐户将不会被删除。
答案 0 :(得分:0)
我想你想做这样的事情。如果名字和姓氏的串联匹配,此代码将检查员工ID是否匹配OR。如果是,则它检查数组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 :(得分:-1)
经过大量的考验和磨难后,我终于得到了它。我最终做的是将所有对象属性转换为正则表达式字符串,然后根据它进行匹配。