我对 Powershell 很陌生,在并行运行我的代码时几乎没有问题。我当前的代码按顺序工作,但到目前为止,让它并行运行的每一次尝试都失败了。这是我打算做的事情:
我需要查询多个域控制器(我使用 Quest cmdlet 中的 get-qaduser 等)来收集我需要的所有信息。由于我目前通过另一个域控制器联系一个域控制器,因此脚本运行了很长时间。我的想法是使用 PS 3.0 的新工作流功能,但显然不允许我将结果导出到文件中。
工作脚本(按顺序):
Add-PSSnapin Quest.ActiveRoles.ADManagement
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0 > OutputFile.csv
get-QADUser -Service 'domaincontroller2:389' -SizeLimit 0 > OutputFile2.csv
and so on
这是我到目前为止所尝试的:
Just an excerpt - there are more get-qaduser and domains in the real script
Workflow Get-Domainaccounts{
Parallel{
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0
}
}
但是在运行时我收到此错误消息:
Microsoft.PowerShell.Utility\Write-Error : The term 'get-QADUser' is not
recognized as the name of a cmdlet, function, script file, or operable
program. Check the spelling of the name, or if a path was included, verify
that the path is correct and try again.
所以我考虑将这些片段添加到我的工作流程中:
Workflow Get-Domainaccounts{
inlinescript {Add-PSSnapin Quest.ActiveRoles.ADManagement}
Parallel{
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0
}
}
简单地添加它们是行不通的,使用 inlinescript 命令不会将其传递给执行 get-QADUser 的线程。我还尝试通过我的个人资料添加管理单元,但工作流程忽略了它。
在 Technet 上,我发现这个功能实际上适用于内置 cmdlet,但同样不适用于 Quest 工具。ForEach-Parallel.ps1 该函数使用干净的运行空间(我假设工作流也这样做)。
这是我尝试运行它的方式:
the hosts.txt contains:
get-QADUser -Service 'domaincontroller:389' -SizeLimit 0 > OutputFile.csv
get-content .\hosts.txt | ForEach-Parallel -ScriptBlock {
$_ | invoke-expression
}
但我没有得到任何输出 - 没有错误消息,什么都没有。在没有 | 的情况下运行代码 调用表达式有效并向我显示文件的内容。我究竟做错了什么?
我要做的就是并行运行 Quest cmdlet。非常感谢任何帮助!