在数组的每个元素上进行foreach

时间:2018-07-12 12:25:27

标签: arrays powershell

我有一个脚本,其中有2个问题。第1部分是一系列变量,这些变量具有使用Get-ADUser满足某些条件的用户。在第2部分中,我想将第1部分中的系统数组添加到列表中,以便在第3部分中将数据与$ tag一起添加到一个大数组中,以便在第4部分中(未显示)所有内容都可以立即处理。

重要的是,第1部分中的所有变量最终都在单个数组中带有标签,并且当将更多变量添加到第1部分时,添加起来很容易。其背后的想法是,人们可以在#1部分中添加,在#2部分中进行引用,而不必重复在#3和#4部分中的代码。

问题:
在第3部分的第2行中,我无法将$ collection数组拆分为该数组和该标记,以添加到$ data数组中。

#1
...
$O365_TransitionGroupMembers = $O365_TransitionGroupMembers | Select-Object -Unique

#2
$collection = `
(($VIPUser),"O365_VIP"),
(($O365_TransitionGroupMembers),"O365_Transition")
...

#3
$collection | ForEach-Object {
    $expression,$tag = $_.split(",")

    $data = ForEach ($User in $expression) {
        #Create new object for passing back the required information
        $Result = New-Object PSObject
        $Result | Add-Member -MemberType NoteProperty -name DistinguishedName -value NotSet
...
        $Result.Tag = $tag
...

编辑:

第1部分中的$ collection和$ vars都是系统数组,第1部分中的$ vars看起来像get-aduser。 $ collection看起来像:

  

14:11 C:\ Users \ d> $ collection |

     

长度:106 LongLength:106 Rank:1 SyncRoot   :{CN = XXX \,XXX,OU = XXX,OU = XXX,OU =域对象,DC = XXX,DC = XXX,DC = XXX,   CN = XXX \,XXX,OU = XXX,OU = XXX,OU =域对象,DC = XXX,DC = XXX,DC = XXX,   CN = XXX,OU =资源,OU = XXX,OU =域对象,DC = XXX,DC = XXX,DC = XXX,   CN = XXX \,XXX,OU = XXX,OU = XXX,OU =域对象,DC = XXX,DC = XXX,DC = XXX ...}   IsReadOnly:假IsFixedSize:真IsSynchronized:假   数:106

     

O365_VIP
  长度:600长长度:600等级:1   SyncRoot:{CN = XXX \,XXX   C,OU = XXX,OU =用户,OU = ME-DXB-IIR,OU =域   对象,DC = XXX,DC = XXX,XXX =净,CN = XXX \,XXXv   C,OU = XXX,OU =用户,OU = ME-DXB-IIR,OU =域   对象,DC = XXX,DC = XXX,DC = XXX,CN = XXX \,XXX   C,OU = XXX,OU =用户,OU = ME-DXB-IIR,OU =域   对象,DC = XXX,DC = XXX,DC = XXX,CN = XXX \,   XXXOU =承包商,OU =用户,OU = ME-DXB-IIR,OU =域   Objects,DC = emea,DC = CorpLAN,DC = net ...} IsReadOnly:False   IsFixedSize:True IsSynchronized:False Count:600

     

O365_Transition

     

14:16 C:\ Users \ shielsd> $ collection [0]
  ...
  SamAccountName:XXX
  SID:S-1-5-XXX-XXX-XXX-XXX-XXX
  姓:XXX
  UserPrincipalName:XXX.XXX@XXX.XXX
  DistinguishedName:CN = XXX \,XXX,OU = XXX,OU = XXXXXX,OU =域
  对象,DC = XXX,DC = XXX,DC = XXX
  启用:True
  ExtensionAttribute15:XXX; XXX; O365_VIP
  GivenName:XXX
  名称:XXX,XXX
  ObjectClass:用户
  ObjectGUID:XXX-XXX-XXX-XXX-XXX
  SamAccountName:XXX
  SID:S-1-5-21-XXX-XXX-XXX-XXX
  姓:XXX
  UserPrincipalName:XXX.XXX@XXX.com

     

O365_VIP

我收到的错误是:

  

方法调用失败,因为   [Microsoft.ActiveDirectory.Management.ADUser]不包含   名为“ split”的方法。在线:2字符:5   + $ expression,$ tag = $ _。split(“,”)   + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~       + CategoryInfo:InvalidOperation:(split:String)[],RuntimeException

1 个答案:

答案 0 :(得分:0)

您遇到的问题源于您如何对待$collection,而$O365_TransitionGroupMembers所包含的内容可能会加剧这种情况。既然听起来像是另一个收藏。

当前$collection是一个数组数组。 Also known as a jagged array。由于该逗号被用作数组元素定界符,因此无需拆分。

使用您的代码和示例数据看一下这个例子,这很重要。

$VIPUser = "Matt"
$O365_TransitionGroupMembers = "Tim","John"

$collection = (($VIPUser),"O365_VIP"),
(($O365_TransitionGroupMembers),"O365_Transition")

$collection | ForEach-Object{
    write-host ("This element contains {0} items and the second on is: {1}" -f $_.count, $_[1])
}

数组元素中的实际数据不包含逗号(根据我们的观察),因此您的拆分将仅填充$expression。还将把数组展平为以空格分隔的字符串。