需要在比较后创建存储用户信息的新对象的指导



我有一些代码将在下面显示;它使用LINQ比较2个对象。我有两个变量。1是需要添加的新项目的比较,另一个是需要删除的项目的比较。

当我进行比较时,它可以很好地工作,但它首先比较名字,然后是中间首字母,然后是姓氏,依此类推。当我在最后打印出变量时,它会以相同的顺序打印出来。名字先名字后中间名首字母后姓氏。。。

相反,我想做的是将它组织在一个表中,该表按顺序输出它,例如,它输出用户和它的所有属性。

这是我的密码。

#Our Array of values we will be comparing
[array]$CompareValues = "FirstName","MiddleName","LastName","DisplayName","Email","Mobile","TelephoneNumber","Title","Dept","Company"
for($i=0; $i -lt $CompareValues.Count; $i++)
{
#First let's create 2 variables that will hold the info we want
$A = ($Users).($CompareValues[$i])
$B = ($Contacts).($CompareValues[$i])
##################### Compare existing contacts to Users #####################
#Only Run if there are contacts; otherwise there is nothing for us to compare
if(($NULL -ne $B))
{
#Displays what accounts we need to import
$NeedsToBeAdded += [string[]]([Linq.Enumerable]::Except([object[]]$a, [object[]]$b))
#Displays what accounts we need to delete because they no longer exist
$NeedsToBeDeleted += [string[]]([Linq.Enumerable]::Except([object[]]$b, [object[]]$a))
}
}

以下是它如何打印(作为一个例子(

Bob 
Mary
John
Jones
Joe
Nowak
Bjones
Mjoe
Jnowak
bjones@domain.com
mjoe@domain.com
jnowak@domain.com
123-456-7890
123-456-7891
123-456-7892
Manager
Accountant
Engineer
HR
Accounting
IT
CompanyName
CompanyName
CompanyName

以下是我希望它作为示例打印的方式(不需要分隔符,我只是使用逗号来提高可读性(

Bob , , Jones, Bjones, bjones@domain.com, 123-456-7890, , Manager, HR, CompanyName
Mary , , joe, Mjoe, mjoe@domain.com, 123-456-7891, , Accountant, Accounting, CompanyName
John , , Nowak, Jnowak, jnowak@domain.com, 123-456-7892, , Engineer, IT, CompanyName

我怎样才能取得这样的成就?我的最终目标是,在我将所有内容正确存储在变量中后,我将遍历每个对象,然后更新联系人列表,要么添加具有上述属性的新用户,要么删除用户及其联系信息,因为它们已不存在。

首先,只有当特定值不在列表中时,才更新联系人,这会导致问题。例如,让我们看看姓氏:

$Users.LastName $Contacts.LastName
--------------- ------------------
Smith           Joe     # 
Joe-Jones       Joe     #
Smith           Nowak   ## These three changed
Smith           Smith
Joe             Joe
Nowak           Nowak

如果要按名称比较这些条目,脚本将只返回一个新条目。在这里,两位用户将他们的姓氏改为smith:

$A = ($Users).LastName
$B = ($Contacts).LastName
$NeedsToBeAdded += [string[]]([Linq.Enumerable]::Except([object[]]$a, [object[]]$b))
$NeedsToBeAdded
#Outputs:
Joe-Jones  # Missing two changes!

"Smith";已在联系人列表中,因此看不到任何差异。

相反,你需要比较每个完整的对象,或者有某种唯一的ID来匹配上的用户和联系人。最简单的答案是Compare-Object,你可以在其中添加所有要比较的属性:

$Diff = Compare-Object $Users $Contacts -Property FirstName,LastName,Email -PassThru
$NeedsToBeAdded   = $diff | Where SideIndicator -eq '=>'
$NeedsToBeDeleted = $diff | Where SideIndicator -eq '<='

-PassThru允许它输出一个原始对象:

$NeedsToBeAdded | ft FirstName,LastName,Email
FirstName LastName  Email            
--------- --------  -----            
Bob       Smith     bjones@domain.com
Mary      Joe-Jones mjoe@domain.com  
John      Smith     jnowak@domain.com

最新更新