Эта рекомендация, возможно, не самый лучший подход, но пришла на ум при запуске процесса. Фокус в том, что сценарий знает, что другой процесс запущен, и необходимо сообщить, что другой процесс завершен. Один из методов заключается в том, чтобы связать EXE, записав файл прямо перед его закрытием, скрипт постоянно читает файл, ожидающий определенного выхода, введенного EXE. Это грязно, так что другой способ - использовать Windows Forms в Powershell и вызвать форму в PowerShell вместо EXE (при необходимости я могу уточнить). Мое третье решение, вероятно, проще всего реализовать, но не самое чистое. Перед запуском EXE, получите все процессы и сохраните их в массиве. Затем я запустил EXE и снова получил процессы, но на этот раз искал тот, который не находится в этом массиве. Вероятно, это будет ваш EXE, который вы можете иметь, чтобы сценарий затем выполнялся в цикле while и ожидал, что этот процесс будет удален. Пример:
$processes = (Get-Process).Id
Start-Process ".\file.exe"
Start-Sleep -Seconds 1
$exeProc = (Get-Process).Id | ?{$processes -notcontains $_}
$running = (Get-Process | ?{$_.Id -match $exeProc}).Id
while($running){
Start-Sleep -Seconds 1
$running = (Get-Process | ?{$_.Id -match $exeProc}).Id
}
Вы уверены, что 'file.exe' не просто создает дочерний процесс и умирает? – PetSerAl
@PetSerAl Интересный вопрос, но кажется, что 'Start-Process -Wait' на самом деле ждет и дочерних процессов: https://gist.github.com/IISResetMe/46692538055e570b4a15 –
Как насчет' (Start-Process ". \ File .exe "-PassThru) .WaitForExit()'? –