Як ви чекаєте завершення exe в пакетному файлі?


43

Я намагаюся створити скрипт для виконання exe при відключенні, щоб встановити sp1. мій сценарій має щось на зразок (не фактичний сценарій bat).

If installed GOTO END
    Install.exe
END:

Моя проблема полягає в тому, що коли він запускається, він запускає інсталятор, а потім закінчує сценарій, оскільки інсталятор - це інший процес, і слідкує за тим, щоб вимкнути процес встановлення, тому що комп'ютер вимикає і вимикає систему (принаймні, саме так я думаю це робиться.)

Чи є якийсь спосіб сказати йому почекати, поки процес, який він розпочав, завершиться, а потім закрити?

Відповіді:


81

Спробуйте запустити

START /WAIT Install.exe

чудова робота з цією відповіддю!
l - '' '''--------- '' '' '' '' '' '17

Чи можете ви ланцюжок? like start /wait install; exit?
Serj Sagan

завжди можна зробитиcmd /C start /wait install
сірий вовк

Що робити, якщо вам потрібно дочекатися процесу, коли пакетний файл не запустився?
Кайл Делані

23

Один коротший спосіб:

Install.exe|more

Також

install|rem

може бути використаний, хоча в кінцевому підсумку ви зможете знайти деякий вихід консолі. І це є причиною, що це працює - команда piped чекає на введення до завершення .exe


а чому нижчий потік?
npocmaka

Це чудово! Я голосую за вас.
Changwang Zhang

2
це явно перемагає
Фнорд

що робити, якщо exe приймає параметри? як би це працювало?
m4l490n

@ m4l490n - це буде добре. Перенаправлення і умовне виконання оператори мають більш високий пріоритет в пакетних сценаріїв ( <, >, >>, &, &&, ||, |)
npocmaka

13

Або зателефонувати в exe безпосередньо з пакетного файлу, або за допомогою start /waitбуде працювати, але є застереження.

Якщо exe, якого ви викликаєте, створює інший процес, наприклад, виклик іншого exe, а потім виходить із пакетного файлу, буде продовжувати обробку після закінчення виклику exe, оскільки він не знає про інші запущені ним процеси.

У вашому випадку це справжня проблема, оскільки інсталятори зазвичай витягують файли з якоїсь форми стисненого контейнера, який може бути вбудований у саму програму exe, після чого запустити один із вилучених файлів та вийти. Деякі програми встановлення надають параметри командного рядка, які сповіщають оригінал exe не виходити, поки вся установка не буде завершена, тому це, можливо, ви захочете дослідити. Крім цього, реально не обійтися цим способом лише з пакетними файлами, і це вирішило б програмне рішення.


Ви завжди можете додати цикл до програми вимкнення, щоб перевірити, чи працює msiexec.exe (або що б там не було), а потім знову зачекайте та петлі.
mfinni

@mfinni, лише щоб ще більше ускладнити справи, msiexecчасто призводить і до інших процесів. :(
Джон Гарденєр

1
Власне, навіщо взагалі це потрібно start /wait? Я сам вважав, що це потрібно використовувати start /waitдля блокування пакетного файлу, поки не закінчиться додаток GUI (на відміну від консолі). Але тестуючи це зараз, я бачу, що пакетні файли насправді чекають навіть GUI-програм. Я розмістив відповідне запитання: Чому програма GUI блокує пакетний файл?
Мартін Прикриль

У мене була ця проблема, я додав своє рішення як відповідь.
FreeSoftwareServers

5

Ось приклад використання MATLAB! Я припустив, що налаштування шляху для MATLAB виконано, а вихід MATLAB забезпечується файлом FileName.m (або користувач вказав його внутрішньо).

echo off
matlab -nosplash /r "FileName.m"
:loop
tasklist /fi "imagename eq MATLAB.exe" |find ":" > nul
if errorlevel 1 goto loop
exit

2
Якщо припустити, що Matlab здається мені трохи дивним, особливо тут на сервері за замовчуванням.
Ерік

Це може працювати для речей, крім MATLAB. Просто змініть "MATLAB.exe" на щось інше. І, можливо, виправте цю другу «знахідку», щоб знову знайти exe у відфільтрованому виході.
Олівер Бок

1

У мене була проблема @John Gardeniers Якщо або описав, де мій exe викликав інший exe і припинявся, для цього старт / чекання не працювало. Я створив цикл "while", щоб перевірити, чи працює він, а потім переходити, як тільки це буде зроблено. Часи можна змінити відповідно до ваших потреб.

TIMEOUT /T 60

SETLOCAL EnableExtensions
set EXE=MYEXETOCHECK.exe
:LOOPSTART
FOR /F %%x IN ('tasklist /NH /FI "IMAGENAME eq %EXE%"') DO IF %%x == %EXE% goto FOUND
goto FIN
:FOUND
TIMEOUT /T 30
goto LOOPSTART
:FIN

0

Ви можете скористатися командою пуску / очікування. Це запускає програму і чекає її закінчення.

Або якщо ви знаєте, скільки часу потрібно на виконання, ви можете ознайомитися з командою сну, наданою Інструментами набору ресурсів Windows Server 2003 . Sleep.exe можна використовувати для призупинення вашої партії на будь-яку кількість секунд, щоб програма могла повністю встановитись, перш ніж пакетний файл продовжить інсталювати що-небудь інше. Є деякі програми, які ігнорують синтаксис "запуск / зачекання", через те, що сама програма запустила інший процес, тоді sleep.exe дуже корисний.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.