Как продолжить сценарий powershell после завершения работы дочерних сценариев powershell?

#powershell

#powershell

Вопрос:

В настоящее время я борюсь с проблемой и был бы признателен за любую помощь или ввод.

У меня есть сценарий powershell, который во время его выполнения запускает другие сценарии powershell, которые выполняют различные команды. Все эти сгенерированные сценарии powershell завершаются автоматически после выполнения их команд.

Что я пытаюсь сделать, так это то, что после завершения всех этих созданных экземпляров powershell запустите другую команду в исходном сценарии powershell. В основном дождитесь завершения всех созданных экземпляров powershell, а затем запустите команду.

Есть идеи о том, как это реализовать?

Спасибо

Редактировать: код, который порождает сценарии powershell, выглядит следующим образом:

 foreach ($var in $filters){
    start-process powershell.exe -Verb Runas -argument "-nologo -noprofile -command .$var"}
  

Комментарии:

1. Посмотрите на задания .

2. Спасибо @JeroenMostert, но я не уверен, как это поможет. Фрагмент кода, который порождает сценарии powershell, выглядит следующим образом foreach ($var в $filters){start-process powershell.exe -Глагол Runas -аргумент » -nologo -noprofile -команда . $var»} Помещение этого в ScriptBlock выдает ошибку

3. Вы не должны помещать свой код в комментарий, поместите его в вопрос.

Ответ №1:

Вы можете использовать Wait-Process . Используйте -PassThru переключатель для возврата запущенных процессов. Это должно сработать:

 $processes = foreach ($var in $filters) {
    Start-Process powershell.exe -PassThru -Verb RunAs -Arg "-nologo -noprofile -command .$var"
}
# wait for processes to finish
$processes | Wait-Process
# now, run your other commands
# ...
  

Вы также можете использовать фоновые задания, подобные этому (используя автоматическую переменную $ PWD):

 # run all scripts as background jobs
$jobs = foreach ($var in $filters) {
    Start-Job -FilePath "$PWD$var"
}
# wait for all jobs to finish
$jobs | Wait-Job
# now, run your other commands
# ...
  

или в однострочном:

 $filters | foreach { Start-Job -FilePath "$PWD$_" } | Wait-Job
  

Комментарии:

1. @stereoscopique Да, это работает, но вам также следует подумать, действительно ли это лучшее решение, и взглянуть на задания PowerShell.

Ответ №2:

Вы можете попробовать это с помощью заданий powershell, как сказал @jeorenmostert

 $j=$filters|%{
start-job -filepath "$($_)"
}
$j|wait-job
  
  • здесь сначала выполните итерацию по $filters использованию % псевдонима ForEach

  • затем запустите каждое задание ( $_ ) — это переменная конвейера

  • получить их внутри $j переменной

  • передайте $j задания wait-job , чтобы дождаться завершения заданий (вы также можете передать receive-job их, чтобы получить результаты, похожие на passthru)