Команда CALL или START с параметром / WAIT

149

Как команда START с опцией WAIT

START /wait notepad.exe 
START /wait  notepad.exe 

... отличается от использования команды CALL?

CALL notepad.exe 
CALL notepad.exe 

Есть ли ситуация, когда один может вести себя иначе, чем другой, в зависимости от того, что выполняется?

Чад
источник
2
Взгляните на technet.microsoft.com/en-us/library/bb491005.aspx о START, а technet.microsoft.com/en-us/library/bb490873.aspx о CALL
Разработчик

Ответы:

183

Для exe- файлов, я полагаю, различия почти не важны.
Но для запуска exe вам даже не нужно CALL.

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

STARTсоздаст новый cmd.exe для вызываемого пакета и без / b откроет новое окно.
Поскольку это новый контекст, переменные не могут быть общими.

Различия

Использованиеstart /wait <prog>
- Изменения переменных среды теряются по <prog>окончании
- Вызывающий ожидает <prog>завершения

Использованиеcall <prog>
- Для exe его можно опустить, потому что это равносильно только запуску <prog>
- Для exe-prog пакет вызывающей программы ожидает или запускает exe асинхронно, но поведение зависит от самого exe-файла .
- Для пакетных файлов пакет вызывающего абонента продолжается, когда вызываемый <batch-file>завершается, БЕЗ вызова элемент управления не вернется в пакет вызывающего абонента.

Приложение:

Использование CALLможет изменять параметры (для пакетных и исполняемых файлов), но только в том случае, если они содержат символы каретки или процента.

call myProg param1 param^^2 "param^3" %%path%%

Будет расширен до (из пакетного файла)

myProg param1 param2 param^^3 <content of path>
Джеб
источник
25
При выполнении файла file.bat с использованием START / WAIT необходимо указать START / WAIT cmd / c «file.bat», а не просто START / WAIT «file.bat», иначе окно cmd, созданное для file.bat, останется открытым
FrinkTheBrave
5
Вы можете найти сравнение между CALL и START по адресу: ss64.com/nt/start.html (обновлено сегодня разделами «Start / Wait» и «START vs CALL»)
Альфредо
Мой любимый, start /wait /b cmd /c <batchfile.bat>потому что командные файлы запускаются один за другим в одном и том же командном окне
linux64kb
@ linux64kb, но для пакетных файлов это не нужно, нужно толькоcall batchfile.bat
jeb
@jeb Правда. Я предпочитаю этот, потому что каждый пакетный файл будет работать в своей среде командной оболочки, наследуя переменные из вызывающей оболочки и изменения начальных значений будут потеряны после завершения пакета -> мусора не осталось после каждого последовательного запуска. Еще один выигрыш в том, что вам не нужно иметь дело со сбросом переменных в ваших скриптах.
linux64kb
17

Я думаю, что они должны работать в целом одинаково, но есть некоторые различия. STARTобычно используется для запуска приложений или для запуска приложения по умолчанию для файлов данного типа. Таким образом, если вы START http://mywebsite.comэтого не делаете START iexplore.exe http://mywebsite.com.

START myworddoc.docxзапустит Microsoft Word и откроет myworddoc.docx. CALL myworddoc.docxделает то же самое ... однако STARTпредоставляет больше возможностей для состояния окна и тому подобного. Это также позволяет установить приоритет процесса и сходство.

Короче говоря, учитывая дополнительные параметры, предоставляемые start, он должен быть вашим выбором.

START ["title"] [/D path] [/I] [/MIN] [/MAX] [/SEPARATE | /SHARED]
  [/LOW | /NORMAL | /HIGH | /REALTIME | /ABOVENORMAL | /BELOWNORMAL]
  [/NODE <NUMA node>] [/AFFINITY <hex affinity mask>] [/WAIT] [/B]
  [command/program] [parameters]

"title"     Title to display in window title bar.
path        Starting directory.
B           Start application without creating a new window. The
            application has ^C handling ignored. Unless the application
            enables ^C processing, ^Break is the only way to interrupt
            the application.
I           The new environment will be the original environment passed
            to the cmd.exe and not the current environment.
MIN         Start window minimized.
MAX         Start window maximized.
SEPARATE    Start 16-bit Windows program in separate memory space.
SHARED      Start 16-bit Windows program in shared memory space.
LOW         Start application in the IDLE priority class.
NORMAL      Start application in the NORMAL priority class.
HIGH        Start application in the HIGH priority class.
REALTIME    Start application in the REALTIME priority class.
ABOVENORMAL Start application in the ABOVENORMAL priority class.
BELOWNORMAL Start application in the BELOWNORMAL priority class.
NODE        Specifies the preferred Non-Uniform Memory Architecture (NUMA)
            node as a decimal integer.
AFFINITY    Specifies the processor affinity mask as a hexadecimal number.
            The process is restricted to running on these processors.

            The affinity mask is interpreted differently when /AFFINITY and
            /NODE are combined.  Specify the affinity mask as if the NUMA
            node's processor mask is right shifted to begin at bit zero.
            The process is restricted to running on those processors in
            common between the specified affinity mask and the NUMA node.
            If no processors are in common, the process is restricted to
            running on the specified NUMA node.
WAIT        Start application and wait for it to terminate.
mckeejm
источник
11

Есть полезная разница между callи start /waitпри вызове, regsvr32.exe /sнапример, на которую также ссылается Гэри в своем ответе на командную строку how-do-i-get-the-application-exit-code-from-a-windows-windows

call regsvr32.exe /s broken.dll
echo %errorlevel%

всегда будет возвращать 0, но

start /wait regsvr32.exe /s broken.dll
echo %errorlevel%

вернет уровень ошибки от regsvr32.exe

aedjp
источник
8

Это то, что я обнаружил при параллельном запуске командных файлов (несколько экземпляров одного и того же bat-файла одновременно с разными входными параметрами):

Допустим, у вас есть исполняемый файл, который выполняет длинную задачу под названием LongRunningTask.exe

Если вы вызываете exe-файл непосредственно из файла bat, будет выполнен только первый вызов LongRunningTask, в то время как остальные вызовут ошибку ОС «Файл уже используется процессом»

Если вы используете эту команду:

start / B / WAIT "" "LongRunningTask.exe" "параметры"

Вы сможете запустить несколько экземпляров bat и exe, все еще ожидая завершения задачи, прежде чем bat продолжит выполнение оставшихся команд. Параметр / B позволяет избежать создания другого окна, для работы команды необходимы пустые кавычки, см. Ссылку ниже.

Обратите внимание, что если вы не используете / WAIT в начале, LongRunningTask будет выполняться в то же время, что и остальные команды в пакетном файле, поэтому это может создать проблемы, если одна из этих команд требует вывода LongRunningTask.

Возобновление:

Это не может работать параллельно:

  • вызвать LongRunningTask.exe

Это будет работать параллельно и будет в порядке, если между выходными данными команды и остальной частью файла bat нет зависимости между данными:

  • start / B "" "LongRunningTask.exe" "параметры"

Это будет выполняться параллельно и будет ждать завершения задачи, поэтому вы можете использовать вывод:

  • start / B / WAIT "" "LongRunningTask.exe" "параметры"

Ссылка на команду запуска: Как запустить программу из командного файла, не оставляя консоль открытой после запуска программы?

Cherno
источник
6

Вызов

Вызывает одну пакетную программу из другой, не останавливая родительскую пакетную программу. Команда call принимает метки в качестве цели вызова. Вызов не влияет на командную строку при использовании вне сценария или командного файла. https://technet.microsoft.com/en-us/library/bb490873.aspx

Начало

Запускает отдельное окно командной строки для запуска указанной программы или команды. При использовании без параметров start открывает второе окно командной строки. https://technet.microsoft.com/en-us/library/bb491005.aspx

проявитель
источник
-1

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

В конце концов, передача команды через большее сделала свое дело.

setup.exe {аргументы} | Больше

Стивен Шелдон
источник