并行运行Quest cmdlet并将输出保存到文件

时间:2013-01-31 14:36:11

标签: powershell powershell-v3.0 quest

我是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。任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

您的错误表明您没有将Quest模块导入工作流会话,尝试这样的事情...... 在$ Session变量

中获取工作流会话
Invoke-Command -Session $Session -ScriptBlock {Import-Module <ModuleName> -Verbose}

希望这有帮助, 克里斯