【问题标题】:Powershell: Don't wait on function returnPowershell:不要等待函数返回
【发布时间】:2014-02-10 15:57:22
【问题描述】:

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

有没有一种方法可以调用函数而不是等待它的返回,然后再继续下一个函数调用?

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

function generate_html($var)
{
...
}

generate_html team1
generate_html team2

【问题讨论】:

  • 看看使用jobs:get-help about_jobs

标签: powershell parallel-processing


【解决方案1】:

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

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

function generate_html($var)
{
#snipped
}

Start-Job -ScriptBlock { generate_html team1 }

如果您需要监视作业是否完成,请存储 Start-Job 的输出或使用 Get-Job 让当前会话中的所有作业开始,取出您想要的作业。 一旦你有了它,检查State 属性以查看值是否为Finished

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

尝试将您的函数声明为脚本块:

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

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

【讨论】:

  • 注意receive-job上的-Keep标志可以防止接收后自动删除结果。 receive-job -name MyJob -Keep 万一这成为任何读者的问题。
  • 我收到以下错误:术语“generate_html”未被识别为 cmdlet、函数、脚本文件或可运行程序的名称。
【解决方案2】:

对我来说,问题是我的函数会创建一个 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2020-12-23
    • 2019-07-25
    • 2021-04-03
    相关资源
    最近更新 更多