@Daddy_Cool

Как сделать чтобы программа ждала завершения bat-файла?

Есть некая внешняя программа которая запускается из bat-файла program.bat (внутри него prog.exe и еще что-то).
Мне надо, чтобы программа запустилась, что-то сделала, завершилась, и чтобы только после этого продолжилось выполнение основной программы.

Использую Dev C++ 5.11. Под Windows 7 все как надо, запускаю под Windows 10 (на другой машине) - увы, никакого ожидания, сразу продолжается выполнение, таким образом внешняя программа не успевает выдать результат.

Сама команда выглядит максимально просто:
system("program.bat");

Думается, что это что-то очень простое и надо где-то что-то разрешить или поменять какой-то режим.
  • Вопрос задан
  • 1256 просмотров
Пригласить эксперта
Ответы на вопрос 5
mayton2019
@mayton2019
Bigdata Engineer
Функция CreateProcess

Если ты используешь Windows и С++ то тебе в первую очередь надо изучить какой API предоставляет ОС а уже потом язык.

Вот пример как вызвать внешний процесс и ожидать завершения.

https://docs.microsoft.com/en-us/windows/win32/pro...

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

А вот отсюда ты должен был начать поиски

https://docs.microsoft.com/en-us/windows/win32/api...

Насчет system не уверен. Это функция ОС Unix/Linux и ее вызов в Винде скорее всего будет просто обёрткой над CreateProcess. И какой там контроль над параметрами - чорт его знает. Наверное лучше брать native.
Ответ написан
Slayer_nn
@Slayer_nn Куратор тега Windows
Гугол, памаги!
Ну так я понял скрипт запустил прогу и закрылся. Отсюда и все проблемы

Как вариант
В bat добавить

:repeat
timeout /t 1 /nobreak
tasklist | find /i "Program.exe"
if not errorlevel 1 GOTO repeat
exit

где program.exe > ваша исполняемый файл, кавычки сохраняем
скрипт не закроется, пока не закроется окно

Ну и файл сам запускать через команду start
cd "/D" "D:\Windows"
start notepad.exe

или
start "" "C:\Windows\notepad.exe"
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
Если дело в батнике, то можно запускать программу через start /wait program.exe
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Как уже было сказано system() всегда выполняется синхронно, т.е. ждет окончания выполняемой программы.
В батнике аналогично - когда стартуете команду/программу обычным способом батник приостанавливается до завершения программы.
Так что описанного поведения по этим причинам быть не может.
Скорее всего проблема в чем-то другом.
В конце батника добавьте строку pause, чтоб он не закрывался сразу и посмотрите что выводится на консоль. Подозреваю, там будет какая-то ошибка. Может быть "file not found" или еще что-нибудь.
Ответ написан
Комментировать
@Daddy_Cool Автор вопроса
Пока всё странно. notepad.exe отработает как надо, моя программа почему-то не хочет.
pause в батник ставил - да, батник останавливается.
Как я уже писал - на машине с Windows 7 все работает как надо, а на Win 10 - нет. Сейчас попробую другие компы с Win 10.
--------------
В общем дело не в системе и не в батнике, а в самой программе которая запускается дочерним процессом. Другие версии этой программы отрабатывают нормально.
В чем причина такого поведения я так и не понял, но свою задачу решил.
Большое спасибо всем за помощь и обсуждение!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы