Команда CALL и START с опцией/WAIT
Как работает команда START с опцией WAIT
START /wait notepad.exe
START /wait notepad.exe
... любое отличие от использования команды CALL?
CALL notepad.exe
CALL notepad.exe
Есть ли ситуация, когда можно вести себя по-другому, а другая зависит от того, что выполняется?
Ответы
Ответ 1
Для exe файлов, я полагаю, различия почти не важны.
Но для запуска exe вам даже не нужен CALL
.
При запуске другой партии это большая разница,
поскольку CALL
запустит его в том же окне, и вызываемый пакет получит доступ к тому же переменному контексту.
Таким образом, он также может изменять переменные, которые влияют на вызывающего.
START
создаст новый cmd.exe для вызываемого пакета и без /b откроет новое окно.
Поскольку это новый контекст, переменные не могут быть общими.
Различия
Использование start/wait <prog>
- Изменения переменных среды теряются, когда заканчивается <prog>
- Звонящий ждет, пока не закончится <prog>
Использование call <prog>
- Для exe его можно опустить, потому что он равен только запуску <prog>
- Для exe-программы пакет вызывающего ожидает или запускает exe файл асинхронным, но поведение зависит от самого exe файла.
- Для пакетных файлов пакет вызывающего абонента продолжается, когда вызываемый <batch-file>
завершается, БЕЗ вызова элемент управления не вернется в пакет вызывающего абонента.
Приложение:
Использование CALL
может изменить параметры (для пакетных и exe файлов), но только в том случае, если они содержат каретки или знаки процента.
call myProg param1 param^^2 "param^3" %%path%%
Будет расширен до (из пакетного файла)
myProg param1 param2 param^^3 <content of path>
Ответ 2
Я думаю, что они должны выполнять в целом то же самое, но есть некоторые различия.
START
обычно используется для запуска приложений или для запуска приложения по умолчанию для заданного типа файла. Таким образом, если вы START http://mywebsite.com
не выполняете START iexplore.exe http://mywebsite.com
.
START myworddoc.docx
запускает Microsoft Word и открывает myworddoc.docx. CALL myworddoc.docx
делает то же самое... однако 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 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.
Ответ 3
Существует полезное различие между call
и start /wait
при вызове regsvr32.exe /s
, также упоминаемом Gary в
в ответ на how-do-i-get-the-application-exit-code-from-a-windows-command-line
call regsvr32.exe /s broken.dll
echo %errorlevel%
всегда будет возвращать 0, но
start /wait regsvr32.exe /s broken.dll
echo %errorlevel%
вернет уровень ошибки из regsvr32.exe
Ответ 4
Вызов
Вызывает одну пакетную программу из другой, не останавливая родительскую пакетную программу. Команда call принимает метки в качестве цели вызова. Вызов не влияет на командную строку при использовании вне сценария или командного файла. https://technet.microsoft.com/en-us/library/bb490873.aspx
Начните
Запускает отдельное окно командной строки для запуска указанной программы или команды. При использовании без параметров start открывает второе окно командной строки. https://technet.microsoft.com/en-us/library/bb491005.aspx
Ответ 5
Это то, что я обнаружил при параллельном запуске пакетных файлов (несколько экземпляров одного и того же файла bat одновременно с разными входными параметрами):
Предположим, что у вас есть exe файл, который выполняет длинную задачу, называемую
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 "" параметры"
Ссылка для команды запуска: Как запустить программу из пакетного файла, не покидая консоль после запуска программы?
Ответ 6
Это старая ветка, но я только что столкнулся с этой ситуацией и обнаружил хороший способ ее обойти. Я пытался запустить файл setup.exe, но фокус возвращался к следующей строке скрипта, не дожидаясь завершения файла setup.exe. Я попробовал вышеуказанные решения без удачи.
В конце концов, передача команды через большее сделала свое дело.
setup.exe {аргументы} | Больше