【问题标题】:Powershell Parallel Loop Not Recognizing ListPowershell 并行循环无法识别列表
【发布时间】:2022-12-03 11:48:31
【问题描述】:

我有一个 powershell 脚本,它试图获取每个 AD 组及其成员。由于我的真实代码是对每个组中的每个用户运行 Get-ADUser,因此我使用并行循环来节省大量时间(旁注:测试后我发现使用多个 Get-ADUser 命令通常比 Get -ADGroupMember)。但是,我注意到在运行并行循环时无法查看组的成员。我写了一些基本的测试代码:

$Groups = Get-ADGroup -Filter * -Properties Created,Modified,Description,Members | select-object -first 50
# Loop A
$Groups | foreach-object {
    $psitem.Members
}
# Loop B
$Groups | foreach-object -parallel {
    $psitem.Members
}

对于上面的测试代码,我可以验证 $Groups 确实具有 Members 属性。他们的 gettype() 输出如下:

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     False    ADPropertyValueCollection                System.Collections.CollectionBase

上面的循环 A 按预期打印每个组成员,但是循环 B 始终不返回任何内容。有人知道为什么会这样吗?如果可能的话,我想使用双并行循环,只是为了节省大量时间,因为这个脚本会定期运行。

我的PS版本是7.2.7

【问题讨论】:

  • $PSItem.Members 更改为 $PSItem['Members']
  • 这很奇怪...
  • @SantiagoSquarzon 似乎有效。谢谢!

标签: powershell parallel.foreach


【解决方案1】:

正如 cmets 中所述,使用 $PSItem['Members'] 可以达到目的:

$Groups = Get-ADGroup -Filter * -Properties Created,Modified,Description,Members | select-object -first 50
$A = $Groups | foreach-object {
    $psitem.Members
}
$B = $Groups | foreach-object -parallel {
    $PSItem['Members']
}
echo "A: $($A.count) ----- B: $($B.count)"

【讨论】:

猜你喜欢
  • 2015-07-31
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 2014-07-08
  • 2014-01-08
  • 2012-09-13
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多