【问题标题】:Copy an element from one array to another in PowerShell在 PowerShell 中将元素从一个数组复制到另一个数组
【发布时间】: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中的所有对象> 当 array1array2 中的 WorkEmail 相等时:

$arrayNew = @(Compare-Object $array1 $array2 -Property WorkEmail -IncludeEqual -passthru | Where-Object {$_.SideIndicator -eq '=='}) 

这一切都很好。当 array1array2 中的 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-Csv cmdlet 返回一个 PSCustomObject。 Get-ADobject cmdlet 返回一个 ActiveDirectory.Management.ADobject。数组,或数组中的数组,是完全不同的东西
  • @Cole9350 - 这就是你要找的东西吗?那会有帮助吗?谢谢
  • @Cole9350 - 谢谢。我不确定,但认为这个问题会变得太大。你在我如何解决它的钱上是对的,这就是我所做的,并且刚刚解决了。我最初错过了 -Force ,它使我远离了 Add-Member 错误,但是一旦我添加了它,我就能够创建 ForEach 循环并复制数据。我最初希望有一种更简单的方法可以直接使用 Compare-Object cmdlet,但我从来没有找到方法。多个 ForEach 循环似乎是唯一的方法。稍后会发布它

标签: arrays powershell


【解决方案1】:

我不确定我是否理解这个问题。是什么阻止您简单地添加它们?

D:\> $arr1=@('a','b','c')
D:\> $arr2=@('d','e','c')
D:\> $arr1+$arr2
a
b
c
d
e
c
D:\> $arr1+$arr2 | select -unique
a
b
c
d
e

【讨论】:

  • 感谢 cmets。我已经更新了原始帖子以更好地解释(并展示所需的结果)我正在寻找。您的建议适用于一个简单的数组,但我正在使用多维数组。当与 WorkEmail 元素匹配时,我只需要将一个元素从一个数组复制到另一个数组
  • 然后你可以看看这篇博文:happysysadm.com/2011/01/… 如果你选择创建 PSObjects 而不是数组,你的生活会轻松很多
  • 谢谢。实际上我最初使用过这种方法,但最终我遇到了不同的问题。我正在做什么,它从 Active Directory 中获取数据,并将其与工资单供应商提供的 Excel 报告中的数据进行比较。我使用上面的示例数组只是为了演示我要完成的工作。
  • 我想我明白你在做什么;我只会用对象来做;这比计算 PowerShell 多维数组更容易操作(添加删除列或属性)。我从来不需要他们,很抱歉,帮不上忙。
  • 感谢您的意见。如果我无法弄清楚,我可能最终会返回并按照我最初拥有它的方式(使用对象)尝试它,但是我必须弄清楚。
【解决方案2】:

我最终要做的是首先使用自定义对象创建 $NewArray

[array]$NewArray = New-Object PSObject
Add-Member -InputObject $NewArray -membertype NoteProperty -Name 'CSVuserID' -Value ""
[array]$ NewArray = @()

我最初必须使用 –Force 选项,因为我是在 ForEach 循环内创建对象。现在我在 Get-ADobjectImport-CSV cmdlet 运行之前创建它。所以现在当我比较 $array1$array2 时,Compare-Object cmdlet 将自动添加所需的任何新成员元素并(扩展) $arrayNew 数组。我只需要为我计划在数组之间复制的任何内容创建新对象。

$arrayNew = @(Compare-Object $array1 $array2 -Property WorkEmail -IncludeEqual -passthru | Where-Object {$_.SideIndicator -eq '=='})

然后一些 ForEach 循环,我最终在 $NewArray 中得到所需的输出:

If ($arrayNew.Count -ge 1)
    {
    $arrayNew | ForEach-Object {
        ForEach ($obj in $array2) {
            If ($obj.Email.ToLower() -eq $_.Email.ToLower() -eq $True)
                {
                $_.CSVuserID = $obj.UserID
                Break
                }
            Else
                {
                Continue
                }
        }
    }
    }

感谢大家的帮助

【讨论】:

    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2018-04-19
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多