如果已经回答了这个问题,请指出我的解决方案,但是,目前我无法在现有帖子中找到答案。
我目前正在 powershell 中使用后台作业,将繁重的进程分解为并行进程,以减少持续时间。 整体概念正在工作,但是,我在将从 Get-ADGroup 返回的 ADgroup 对象的父集合传递到作业的脚本块时遇到了问题。
集合传递得很好,但是,问题是某些属性(即描述和成员(在对象上具有属性条目,但是在脚本块中缺少一次值。在输入脚本块之前,我验证了这些值是否存在。我还验证了 scriptb 锁是否正在解释脚本块内正确传递的对象类型,但这些值一旦进入就为空。
奇怪的是,如果我使用 ConvertTo-JSON 序列化对象,则值是这种格式的值,而不是 .NET 对象形式。我想知道它是否与传递给脚本块时对象的序列化有关?
最后一点,如果我创建一个自定义对象并使用 ADGroup 对象的属性和值填充它,然后将其交给脚本块,一切都很好。我尝试通过"$Using:var"构造传递对象,以及通过参数列表显式传递对象并在脚本块中定义特定于类型的参数。
希望对底层架构有更好理解的人可以对此有所了解。下面是我正在做的事情的简化版本,将值输出到文件中只是为了查看我在脚本块中得到什么,我可以得到 SAM,但没有描述或成员
$adgroups = Get-ADGroup -Server $domain -Properties Description, member -SearchBase $ou -LDAPFilter "(samaccountname=*)"
$ps = [powershell]::create()
[void]$ps.AddScript({
Param([ADGroup[]]$groups)
foreach ($group in $groups) {
"SAM: $($group.samAccountName)" | Out-File output.txt
"Description: $($group.description)" | Out-File output.txt -append
"Members: $($group.member)" | Out-File output.txt -append
}
}).AddParameter('groups', $adgroups)
$ps.Invoke()
$ps.Dispose()
同样,属性值在进入脚本块之前就存在,但只有值在脚本块中为空。
哇,我试图用作业来做到这一点,但我无法让整个数组传入。 它只打印一条记录。 但& $block $adgroups
工作正常。
$adgroups = Get-ADGroup -Properties Description, member -LDAPFilter "(samaccountname=*)" -resultsetsize 5
$block = {
Param([object[]]$groups)
$groups.count
foreach ($group in $groups) {
"SAM: $($group.samAccountName)"
"Description: $($group.description)"
"Members: $($group.member)"
}
}
start-job $block -args @($adgroups) | wait-job | receive-job
# output
1
SAM: Remote Desktop Users
Description: Members in this group are granted the right to logon remotely
Members:
编辑:我将数组传递给具有"using:"范围的作业:
$groups = Get-ADGroup -Properties Description, member -LDAPFilter "(samaccountname=*)" -resultsetsize 5
$block = {
foreach ($group in $using:groups) {
"SAM: $($group.samAccountName)"
"Description: $($group.description)"
"Members: $($group.member)"
}
}
start-job $block | wait-job | receive-job