2

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

4

1 回答 1

0

Your error indicates you do not have the Quest Module imported into the workflow session, try something like this... Get your workflow session inside of the $Session variable

Invoke-Command -Session $Session -ScriptBlock {Import-Module <ModuleName> -Verbose}

Hope this helps, Chris

于 2013-01-31T15:26:28.967 回答