【发布时间】:2014-07-26 17:26:01
【问题描述】:
我正在尝试将一个元素从一个多维数组复制到另一个多维数组(每个数组的元素作为示例):
(数组1)
EmpID Badge WorkEmail
1234 ABCD john@acme.com
2345 JKLM mary@acme.com
4567 QWER paul@acme.com
(数组2)
EmpName UserID Email
John 1234 john@acme.com
Mary JKLM mary@acme.com
Linda POIU linda@acme.com
Paul QWER paul@acme.com
我为 array2 中的元素 Email 创建了一个别名,名为 WorkEmail:
$array2 = $array2 | Add-Member -MemberType AliasProperty -Name WorkEmail -Value "Email" -PassThru
我正在使用 Compare-Object 根据 WorkEmail 元素/别名比较这两个数组,我想保留 array1中的所有对象> 当 array1 和 array2 中的 WorkEmail 相等时:
$arrayNew = @(Compare-Object $array1 $array2 -Property WorkEmail -IncludeEqual -passthru | Where-Object {$_.SideIndicator -eq '=='})
这一切都很好。当 array1 和 array2 中的 WorkEmail 相等时,我将 array1 中的匹配值复制到 数组新。但是是否也可以在该复制过程中包含来自 array2 的元素(基本上是从 array2 中获取元素并在 时将它们添加到 array1 WorkEmail 匹配)?我真的只需要将 array2 中的 UserID 包含在 arrayNew 中,但是如果我可以组合这两个数组(当有匹配时)也为我工作。可以在这里做任何事情吗?我无法弄清楚或找到解决方案?
(除了上面的原始数组值之外,还有其他编辑):
理想情况下,我希望得到以下多维数组:
(新数组)
EmpID Badge WorkEmail UserID
1234 ABCD john@acme.com 1234
2345 JKLM mary@acme.com JKLM
4567 QWER paul@acme.com QWER
(Linda 被跳过,因为两个数组中的 WorkEmail 元素都不匹配)
(下面的另一个编辑,如 @Cole9350 请求 - 希望它会有所帮助并且不会太多):
$ADobjects | Get-Member | fl
(大部分返回)
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : Contains
MemberType : Method
Definition : bool Contains(string propertyName)
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : Equals
MemberType : Method
Definition : bool Equals(System.Object obj)
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : GetEnumerator
MemberType : Method
Definition : System.Collections.IDictionaryEnumerator GetEnumerator()
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : GetHashCode
MemberType : Method
Definition : int GetHashCode()
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : GetType
MemberType : Method
Definition : type GetType()
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : ToString
MemberType : Method
Definition : string ToString()
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : SideIndicator
MemberType : NoteProperty
Definition : System.String SideIndicator===
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : Item
MemberType : ParameterizedProperty
Definition : Microsoft.ActiveDirectory.Management.ADPropertyValueCollection Item(string
propertyName) {get;}
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : DistinguishedName
MemberType : Property
Definition : System.String DistinguishedName {get;set;}
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : Name
MemberType : Property
Definition : System.String Name {get;}
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : ObjectClass
MemberType : Property
Definition : System.String ObjectClass {get;set;}
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : ObjectGUID
MemberType : Property
Definition : System.Nullable`1[[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089]] ObjectGUID {get;set;}
TypeName : Microsoft.ActiveDirectory.Management.ADObject
Name : userPrincipalName
MemberType : Property
Definition : System.String userPrincipalName {get;set;}
同时
$CSVobjects | Get-Member | fl
(大部分返回)
TypeName : System.Management.Automation.PSCustomObject
Name : UserPrincipalName
MemberType : AliasProperty
Definition : UserPrincipalName = Work Email
TypeName : System.Management.Automation.PSCustomObject
Name : Equals
MemberType : Method
Definition : bool Equals(System.Object obj)
TypeName : System.Management.Automation.PSCustomObject
Name : GetHashCode
MemberType : Method
Definition : int GetHashCode()
TypeName : System.Management.Automation.PSCustomObject
Name : GetType
MemberType : Method
Definition : type GetType()
TypeName : System.Management.Automation.PSCustomObject
Name : ToString
MemberType : Method
Definition : string ToString()
TypeName : System.Management.Automation.PSCustomObject
Name : EmpID
MemberType : NoteProperty
Definition : System.String EmpID=1234
TypeName : System.Management.Automation.PSCustomObject
Name : Job Title
MemberType : NoteProperty
Definition : System.String Job Title =Genius
TypeName : System.Management.Automation.PSCustomObject
Name : Name
MemberType : NoteProperty
Definition : System.String Name=Coyote, Wile E
TypeName : System.Management.Automation.PSCustomObject
Name : SideIndicator
MemberType : NoteProperty
Definition : System.String SideIndicator==>
TypeName : System.Management.Automation.PSCustomObject
Name : Work Email
MemberType : NoteProperty
Definition : System.String Work Email=john.doe@acme.com
我希望它会很简单,所以我最初让这个例子更简单。现在,减去一些元素,这是我真正使用的数组的核心。我的目标是根据 UserPrincipalName 成员元素(一个是别名)比较这两个数组,这将复制等于第三个数组的项目(保持原始数组不变)。除了将第一个数组中的匹配项复制到新数组中之外,我还需要从第二个数组中复制成员元素 EmpID 并将其添加到新创建的数组中(基本上结合数组在一起)。似乎 COMpare-Object 本身没有这种能力,所以我尝试使用 Add-Member 之类的东西来做到这一点。但我这样做:
$NewArray | Add-Member -membertype NoteProperty -Name 'EmpID' -Value 'tempdata'
我最终得到了错误:
Add-Member : Cannot add a member with the name "EmpID" because a member with that name already
exists. If you want to overwrite the member anyway, use the Force parameter to overwrite it.
(etc...)
由于我不能像我想要的那样直接组合数据,我的想法是在新数组中添加一个新成员(使用 Compare-Object 创建)然后 ForEach 通过原来的数组将额外需要的数据复制到新的数组中。
感谢您的帮助
【问题讨论】:
-
如果你真的有一个“数组”或“多维数组”,它看起来不会像一个表格。执行
$array1 | get-member以查看您实际使用的对象类型,或向我们展示您是如何创建该对象的 -
一个数组来自 Get-ADobject,另一个来自 Import-CSV。它们确实是多维数组。在我的脚本的当前版本中,我实际上并没有创建数组元素。我最初尝试这样做,但遇到了其他问题,所以我使用了更简单的 Import-CSV 方法。这有帮助吗?
-
不,这仍然没有意义。
Import-Csvcmdlet 返回一个 PSCustomObject。Get-ADobjectcmdlet 返回一个 ActiveDirectory.Management.ADobject。数组,或数组中的数组,是完全不同的东西 -
@Cole9350 - 这就是你要找的东西吗?那会有帮助吗?谢谢
-
@Cole9350 - 谢谢。我不确定,但认为这个问题会变得太大。你在我如何解决它的钱上是对的,这就是我所做的,并且刚刚解决了。我最初错过了 -Force ,它使我远离了 Add-Member 错误,但是一旦我添加了它,我就能够创建 ForEach 循环并复制数据。我最初希望有一种更简单的方法可以直接使用 Compare-Object cmdlet,但我从来没有找到方法。多个 ForEach 循环似乎是唯一的方法。稍后会发布它
标签: arrays powershell