Синхронизировать асинхронную работу через Powershell - PullRequest
0 голосов
/ 01 мая 2019

У меня есть функция PowerShell, мне нужно получить значение из нового задания в переменную внутри сценария, без «спящего сценария».

Моя идея похожа на следующую:.

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 голосов
/ 02 мая 2019

Я бы порекомендовал немного изучить 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, который может занимать много памяти. Бо Прокс написал отличную статью об их использовании и даже предоставил свой собственный пользовательский модуль, чтобы сделать их похожим на формат рабочих мест.

Также, если вы хотите поместить их в функцию, вы можете просто обернуть Start-Job / Receive-Job внутри нее и установить ее равной переменной. Вам не нужно возвращать выходные данные в PowerShell, поскольку return - это просто способ выхода из функции, сценария или блока сценария, каждый результат операторов внутри функции будет возвращаться из выходных данных функции, и если вы хотите узнать больше о Что означает возврат, вы можете здесь: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_return

...