2016-01-29 5 views
2

У меня есть сценарий powershell, который вызывает другой .exe-файл. Start-Process ".\file.exe" -waitStart-Process -Wait Not Working

file.exe - это простые окна с некоторым сообщением и одна кнопка для закрытия .exe.

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

Однако процесс начинается, но основная программа не ждет и начинает выполнение остальной части кода.

Есть ли что-то еще, что мне нужно сделать?

+2

Вы уверены, что 'file.exe' не просто создает дочерний процесс и умирает? – PetSerAl

+0

@PetSerAl Интересный вопрос, но кажется, что 'Start-Process -Wait' на самом деле ждет и дочерних процессов: https://gist.github.com/IISResetMe/46692538055e570b4a15 –

+1

Как насчет' (Start-Process ". \ File .exe "-PassThru) .WaitForExit()'? –

ответ

1

не уверен, если это то, что вы ищете, но вы можете использовать NSI обертку для запуска первого скрипта с использованием ExecWait "powershell -File .\file.exe", и это должно выполнить эту работу.

запускать любой другой скрипт после этого, и он будет делать то, что вы ищете.

1

Эта рекомендация, возможно, не самый лучший подход, но пришла на ум при запуске процесса. Фокус в том, что сценарий знает, что другой процесс запущен, и необходимо сообщить, что другой процесс завершен. Один из методов заключается в том, чтобы связать 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 
} 
0

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

Что работает для меня перед добавлением -NoNewWindow переключатель Start-Process

Попробуйте

Start-Process ".\file.exe" -NoNewWindow -Wait