Вот моя проблема. Я запускаю приложение командной строки в скрипте PowerShell, используя оператор вызова (т. Е. Символ & ), например:

& $PathToExe /switch:"lots of args" /anotherswitch:"with more parms" /etc:"$WithAlsoVariables"

Это работает хорошо, на самом деле слишком хорошо. Процесс вызывается, но сценарий будет продолжаться, пока процесс еще выполняется. По большей части это нормально, так как остальная часть сценария не зависит от результатов этого процесса, но мне нужно выполнить очистку после завершения процесса.

Возможно, я смотрел на CmdLet Start-Process с параметром -wait , который, я уверен, будет делать то, что мне нужно, но также немного замедлит работу. EXE может быть запущен параллельно, хотя мне нужно знать, когда процесс будет завершен. В конце я мог бы запустить простой цикл Do-While , проверяя, завершился ли процесс перед очисткой, но я не знаю, как получить конкретный идентификатор процесса для вызванного EXE-файла. Я не могу просто проверить имя процесса, так как могут быть запущены другие запущенные вручную процессы с тем же именем.

Я потратил время на траулинг на каком-то сайте (например, здесь), но пока ничего не появилось. Помощь будет приветствоваться.

Я пытался:

$proc = & $PathToExe /switch:"lots of args" /anotherswitch:"with more parms" /etc:"$WithAlsoVariables"

И хотя процесс начинается, аргументы теперь неверны, поскольку он немедленно останавливается

1 ответ1

1

Итак, после нескольких фальстартов, как видно из комментария выше, я подумал, что уточнить уточняющий ответ (уверен, что есть и другие способы добиться этого):

$ArgList = """/switch:""lots of args"" /anotherswitch:""with more parms" /etc:""$WithAlsoVariables"""
$proc = Start-Process $PathToExe -ArgumentList $ArgList -PassThrough
.
.
# The "-ErrorAction SilentlyContinue" parameter stops an error being thrown if the process has alread finished.
Wait-Process $proc.id -ErrorAction SilentlyContinue
# Clean up code

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .