首页 > 解决方案 > 对数组的每个元素进行 foreach

问题描述

我有一个脚本,其中有 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=Domain Objects,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=Domain Objects,DC=XXX,DC=XXX,DC=XXX...} IsReadOnly : False IsFixedSize : True IsSynchronized : 错误计数: 106

O365_VIP
长度 : 600 LongLength : 600 等级 : 1 SyncRoot : {CN=XXX\, XXX C,OU=XXX,OU=Users,OU=ME-DXB-IIR,OU=Domain Objects,DC=XXX,DC=XXX, XXX=net, CN=XXX\, XXXv C,OU=XXX,OU=Users,OU=ME-DXB-IIR,OU=Domain Objects,DC=XXX,DC=XXX,DC=XXX, CN=XXX\, XXX C,OU=XXX,OU=Users,OU=ME-DXB-IIR,OU=Domain Objects,DC=XXX,DC=XXX,DC=XXX,CN=XXX\,XXXOU=Contractors,OU=Users,OU =ME-DXB-IIR,OU=Domain Objects,DC=emea,DC=CorpLAN,DC=net...} IsReadOnly : False IsFixedSize : True IsSynchronized : False 计数: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=Domain
Objects,DC=XXX,DC=XXX,DC=XXX已
启用 : True
ExtensionAttribute15 : XXX;XXX;O365_VIP
GivenName : XXX
Name : XXX, XXX
ObjectClass:用户
ObjectGUID:XXX-XXX-XXX-XXX-XXX
SamAccountName:XXX
SID:S-1-5-21-XXX-XXX-XXX-XXX
姓氏:XXX
用户主体名称:XXX.XXX@XXX.com

O365_VIP

我收到的错误是:

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

标签: arrayspowershell

解决方案


您的问题源于您的治疗方式,这可能会因所包含的内容$collection而加剧。$O365_TransitionGroupMembers因为它听起来像是另一个系列。

当前$collection是数组数组。也称为锯齿状阵列。由于逗号被用作数组元素分隔符,因此没有什么可拆分的。

使用您的代码和示例数据查看这个示例,这些数据应该可以证明这一点。

$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. 还将您的数组展平为空格分隔的字符串。


推荐阅读