我是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的线程。我也尝试通过我的个人资料添加snapin,但工作流程忽略了它。
在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
}
但我没有得到任何输出 - 没有错误信息,没有。在没有|的情况下运行代码invoke-expression有效并向我显示文件的内容。我做错了什么?
我想要做的就是并行运行Quest cmdlet。任何帮助都非常感谢!
答案 0 :(得分:0)
您的错误表明您没有将Quest模块导入工作流会话,尝试这样的事情...... 在$ Session变量
中获取工作流会话Invoke-Command -Session $Session -ScriptBlock {Import-Module <ModuleName> -Verbose}
希望这有帮助, 克里斯