Как запустить 2 метода одновременно в PowerShell

У меня есть две функции, каждую из которых я хочу запускать в фоновом режиме, отслеживая поведение пользователя. Сами функции работают нормально; однако я не могу понять, как вызвать их обоих для одновременной работы. В UNIX я бы просто использовал fork() и покончил с этим, но я борюсь с PS.

#start-job -ScriptBlock $(func1) 
#start-job -ScriptBlock $(func2)

Поскольку каждая функция выполняется в течение бесконечного времени, вторая строка на самом деле не вызывается, только первая функция фактически выполняет какую-либо работу.

Я пробовал использовать start-job, invoke-command, start-process и метод start в [diagnostics.process]. Моя интуиция подсказывает мне, что я неправильно понимаю, что делает start-job, потому что, если он запускал func1 в фоновом процессе, то нет причин блокировать этот скрипт верхнего уровня. Любая помощь будет оценена по достоинству!


person Robert Whitmer    schedule 11.09.2017    source источник
comment
Попробуйте заменить синтаксис вашего подвыражения $() реальным блоком скрипта {}   -  person Maximilian Burszley    schedule 11.09.2017


Ответы (2)


Используйте этот синтаксис ${function:Function-Name} для ссылки на определение функции:

$job1 = Start-Job -ScriptBlock ${function:func1}
$job2 = Start-Job -ScriptBlock ${function:func2}
person Mathias R. Jessen    schedule 11.09.2017
comment
Почему функция должна быть инициализирована в InitializationScript? - person Ranadip Dutta; 11.09.2017
comment
@RanadipDutta Если функция уже определена в скрипте, нет необходимости ее инициализировать. Оба решения будут работать в зависимости от варианта использования. - person Maximilian Burszley; 11.09.2017
comment
@RanadipDutta {func} будет ссылаться на команду, локальную для области самого блока сценария, передача ссылки на область $function: скопирует определение функции из вызывающей области. - person Mathias R. Jessen; 11.09.2017
comment
@MathiasR.Jessen: теперь понял. Большое спасибо. - person Ranadip Dutta; 11.09.2017
comment
Делает ли ссылка на определение функции синтаксис блока сценариев ненужным? @MathiasR.Jessen - person Maximilian Burszley; 11.09.2017
comment
@TheIncorrigible1 Да, как видите, я передаю ссылку на функцию вместо литерала блока скрипта — это означает, что он работает точно так же при запуске удаленных заданий. - person Mathias R. Jessen; 11.09.2017
comment
Выбрав этот ответ, поскольку кажется, что это будет самое простое решение, однако в итоге я поместил каждую функцию в свой собственный скрипт и вместо этого использовал start-process. - person Robert Whitmer; 11.09.2017

Прежде всего, вы должны использовать блок скрипта для вызова функции внутри.

Во-вторых, функция должна быть объявлена ​​в блоке InitializationScript, иначе Start-job не поймет, какую функцию вызывать.

попробуйте что-то вроде этого:

start-job -InitializationScript {
    #--Define function1 here
    } -ScriptBlock {func1} 

start-job -InitializationScript {
#define your  function2 here
} -ScriptBlock {func2}
person Ranadip Dutta    schedule 11.09.2017