首页 > 解决方案 > 需要有关创建新对象以在比较后存储用户信息的指导

问题描述

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

当我进行比较时,它工作正常,但它首先比较名字,然后是中间名,然后是姓氏等等。当我在最后打印出变量时,它会以相同的顺序打印出来。首先是名字,然后是中间名首字母,然后是姓氏......

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

这是我的代码。

#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

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

标签: arraysperformancepowershelllinqcomparison

解决方案


首先,如果该特定值不在列表中,您只会更新联系人,这将导致问题。例如,让我们看一下姓氏:

$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

推荐阅读