Powershell:不要等待功能返回

时间:2014-02-10 15:57:23

标签: powershell parallel-processing

我有一个Powershell脚本,我正在调用一个名为generate_html的函数。

有没有办法在继续下一个函数调用之前调用函数而不等待它返回?

我宁愿不必将其分解为多个脚本并同时运行这些脚本。

function generate_html($var)
{
...
}

generate_html team1
generate_html team2

2 个答案:

答案 0 :(得分:8)

您可以使用Start-Job cmdlet将方法作为异步作业启动。

所以,你会做这样的事情:

function generate_html($var)
{
#snipped
}

Start-Job -ScriptBlock { generate_html team1 }

如果您需要监控作业是否完成,请存储Start-Job的输出或使用Get-Job在当前会话中启动所有作业,然后拉出所需的作业。 完成后,请检查State属性以查看值是否为Finished

修改: 实际上,我的错误,工作将在另一个线程中,因此在您开始工作的线程中定义或不可用的函数(不在powershell知道的模块中)不可用。

尝试将您的函数声明为scriptblock:

$generateHtml = { 
    param($var)
    #snipped
}

Start-Job -ScriptBlock $generateHtml -ArgumentList team1
Start-Job -ScriptBlock $generateHtml -ArgumentList team2

答案 1 :(得分:0)

对我来说,问题是我的函数会创建一个 Windows 窗体 GUI,并停止运行剩余的脚本,直到我关闭 Windows 窗体 GUI。我找到了解决方案,但对于不同的命令,这里是:Using Invoke-Command -ScriptBlock on a function with arguments

-ScriptBlock 参数中,使用 ${function:YOUR_FUNCTION}

function generate_html($var) {
    # code
}

Start-Job -ScriptBlock ${function:generate_html} -ArgumentList "team1"
Start-Job -ScriptBlock ${function:generate_html} -ArgumentList "team2"

此外,如果您不想从 Start-Job 获得控制台输出,只需将其通过管道传输至 Out-Null

Start-Job -ScriptBlock ${function:generate_html} -ArgumentList "team1" | Out-Null
Start-Job -ScriptBlock ${function:generate_html} -ArgumentList "team2" | Out-Null