【问题标题】:foreach on each element of array对数组的每个元素进行 foreach
【发布时间】:2018-12-20 16:27:23
【问题描述】:

我有一个脚本,其中有 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 : False IsFixedSize : True IsSynchronized : False 计数:106

O365_VIP
长度 : 600 长度 : 600 等级 : 1 SyncRoot : {CN=XXX\, XXX C,OU=XXX,OU=用户,OU=ME-DXB-IIR,OU=域 对象,DC=XXX,DC=XXX,XXX=net, 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=域 对象,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
用户主体名称:XXX.XXX@XXX.XXX
DistinguishedName : CN=XXX\, XXX,OU=XXX,OU=XXXXXX,OU=域
对象,DC=XXX,DC=XXX,DC=XXX
启用:真
ExtensionAttribute15 : XXX;XXX;O365_VIP
名字:XXX
姓名 : XXX, XXX
对象类:用户
对象GUID: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] 不包含 名为“拆分”的方法。在行:2 字符:5 + $表达式,$tag = $_.split(",") + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (split:String) [], RuntimeException

【问题讨论】:

  • 您能否展示$collection 包含的内容的示例?你用逗号分割$collection,但你分配它的方式让我认为值是line-separated而不是comma-separated
  • 我们需要看看$vipuser$O365_TransitionGroupMembers 是什么。将集合放在控制台时会是什么样子会提供更好的洞察力。
  • @Matt - 或者我应该说,$VIPUser$O365_TransitionGroupMembers 的值会很有趣。但无论如何,我认为逗号分隔的拆分在这里不起作用。
  • 同意(为什么我删除了评论)。我认为第一个是标量,另一个是数组。乍一看,这可能是一个锯齿状的二维数组。

标签: arrays powershell


【解决方案1】:

您的问题源于您对待$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。还将您的数组展平为空格分隔的字符串。

【讨论】:

  • > 此元素包含 2 个项目,第二个是:O365_VIP > 此元素包含 2 个项目,第二个是:O365_Transition
  • 感谢您的回答,我还不足以理解从这里去哪里,所以我可以问这个:如何构建我的 $collection 数组以便我可以调用 2 '东西' 在 for 循环的每一行/索引上?拆分只是达到目的的一种手段,我只需要能够说,'对于 $collections 数组中的每一行,用数组做 X 和用文本做 Y
  • 我建议阅读可以帮助您处理锯齿状数组的链接帖子。有了它,您将知道如何在循环中访问您的数据结构。我的回答还显示了一个您应该能够从中推断的示例。由于我没有您的数据,因此我无法确切告诉您该怎么做。在我的代码中,文本是$_[1],第一部分可以通过$_[0] 访问,但是你有多种数据类型,所以没有单一的解决方案。也许ForEach ($User in $_[0]) 或类似的东西。这取决于你的最终游戏是什么。
猜你喜欢
  • 2013-04-04
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2019-09-17
  • 2018-02-03
  • 2010-10-26
相关资源
最近更新 更多