我有一个Powershell脚本,我正在调用一个名为generate_html的函数。
有没有办法在继续下一个函数调用之前调用函数而不等待它返回?
我宁愿不必将其分解为多个脚本并同时运行这些脚本。
function generate_html($var)
{
...
}
generate_html team1
generate_html team2
答案 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