我有一个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
完成任务的简单方法是什么? 谢谢您的帮助。
答案 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