#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)