通过Powershell同步异步作业

时间:2019-05-01 19:50:20

标签: powershell powershell-v5.0 start-job

我有一个PowerShell函数,我需要将该值从new-job传递到脚本中的变量,而无需“使脚本休眠”。

我的想法类似于以下内容...

Function async() 
{
    $scriptblock = { 
                        #Do Something 
                        Start-Sleep -Seconds 60
                        write-output $argsfromFunction 
                   } 
    return $(
                start-job -ScriptBlock $scriptblock 
                          -ArgumentList $argsfromFunction 
            );
}
function getresult() 
{ 
    return $( get-job ( async() ) | receive-job ) 
}
#do it when the async() stop running without interrupt the script and set it to $global:var1

完成任务的简单方法是什么? 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我建议在处理作业之前多学习一点PowerShell,因为它们需要对管道以及PowerShell如何处理输入和输出的更深入的了解。

但是您可以使用以下内容:

$jobToRun = Start-Job -ScriptBlock { #DoStuff }

while ( [Boolean]$( $jobToRun.JobStateInfo.state -ne "Completed" ) )
{
    # Do some stuff in script while job is running
}
$results = Receive-Job -Job $jobToRun

然后根据脚本块的输出,可以通过$results解析所需的内容。您也不必等待作业完成循环,但是如果作业未完成或花费很长时间,则需要有一种方法来处理。同样,一旦您对PowerShell更加满意,我强烈建议您查看运行空间而不是作业,因为每个作业都需要一个新的PowerShell实例,这可能会占用大量内存。 Boe Prox写了一篇很棒的文章,介绍了如何利用它们,甚至提供了自己的自定义模块来使它们与Jobs相似。

如果您想将它们放在函数中,也可以将Start-Job / Receive-Job包裹在其中并将其设置为变量。您无需在PowerShell中返回输出,因为return只是退出函数,脚本或脚本块的一种方式,该函数内部语句的每个结果都将从函数输出中返回,如果您想了解更多内容,请参见Return意味着您可以在这里:https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_return