在比较后需要有关创建存储用户信息的新对象的指导
Need guidance on creating a new object that stores user information after comparing it
我有一些代码将在下面显示;使用 LINQ 比较 2 个对象。我有两个变量。 1是需要添加的新项目的比较,另一个是需要删除的项目的比较。
当我进行比较时,它工作正常,但它首先比较名字,然后是中间名首字母,然后是姓氏,依此类推。当我在最后打印出变量时,它以相同的顺序打印出来。先是名字,然后是中间名,然后是姓氏...
我想做的是将它组织在一个 table 中,按顺序输出它,例如它输出用户及其所有属性。
这是我的代码。
#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
如果您要按名称比较它们,您的脚本只会 return 一个新条目。此处,有两个用户已将姓氏更改为 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
我有一些代码将在下面显示;使用 LINQ 比较 2 个对象。我有两个变量。 1是需要添加的新项目的比较,另一个是需要删除的项目的比较。
当我进行比较时,它工作正常,但它首先比较名字,然后是中间名首字母,然后是姓氏,依此类推。当我在最后打印出变量时,它以相同的顺序打印出来。先是名字,然后是中间名,然后是姓氏...
我想做的是将它组织在一个 table 中,按顺序输出它,例如它输出用户及其所有属性。
这是我的代码。
#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
如果您要按名称比较它们,您的脚本只会 return 一个新条目。此处,有两个用户已将姓氏更改为 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