Несколько способов вызвать командный файл Windows из другого или из командной строки. В каком случае?

92

Пакетный файл Windows ( called.batили called.cmd) можно вызвать из другого командного файла ( caller.batили caller.cmd) или интерактивного приглашения cmd.exe несколькими способами:

  1. прямой вызов: called.bat
  2. используя команду вызова: call called.bat
  3. используя команду cmd: cmd /c called.bat
  4. используя команду запуска: start called.bat

Мне сложно определить их предполагаемое использование на основе текста справки: когда использовать какой? например, почему я могу использовать команду «позвонить» вместо прямого вызова. Что изменилось?

Меня интересует некоторый сводный отчет, в котором анализируются все 4 возможности (и другие, если они отсутствуют) с различных точек зрения: рекомендуемые варианты использования, для которых они предназначены, создание процессов, контекст выполнения, среда, обработка кода возврата.

Примечание. Я использую Windows XP SP3.

тусклый
источник

Ответы:

101
  1. Пакетный файл будет выполнен текущим экземпляром cmd.exe (или новым экземпляром cmd.exe, если, например, дважды щелкнуть его в проводнике).

  2. То же, что и №1, действует только при использовании внутри пакетного / cmd файла. В пакетном файле без «вызова» родительский пакетный файл завершается, и управление передается вызываемому пакетному файлу; с 'call' запускает дочерний пакетный файл, а родительский пакетный файл продолжает операторы после вызова.

  3. Запускает командный файл в новом экземпляре cmd.exe.

  4. Пуск запустит командный файл в новом экземпляре cmd.exe в новом окне, и вызывающий не будет ждать завершения.

Кайл Алонс
источник
7
Обратите внимание на вариант 4: после команды запуска всегда следует «заголовок» , поэтому, если вам не нужен заголовок, вы должны иметь пустые двойные кавычки, напримерstart "" [options] command
Дарин
@Daryn в этой ссылке просто упоминает, что он всегда должен быть у вас, но даже говорит, что Microsoft описывает этот параметр как необязательный. Мне не объясняют, почему это должно быть «обязательным». Даже в некоторых из их примеров внизу отсутствует параметр заголовка.
Адам Плохер
5

Из комментариев здесь неясно одно: когда вы вызываете один командный файл из другого, используя только его имя (случай № 1 в исходном вопросе), выполнение останавливается из вызывающего командного файла. Например, в этих строках:

called.bat
echo Hello

Строка 'echo Hello' (и все, что следует за ней) не вызывается. Если вы используете ключевое слово call, выполнение возобновляется после вызова. Итак, в этом случае:

call called.bat
echo Hello

Будет вызвана строка 'echo Hello'.

Кроме того, все переменные, установленные в файле called.bat, также будут переданы обратно вызывающему процессу.

Представьте себе файл named.bat, в котором есть такая строка:

set MYVAR=hello

Затем% MYVAR% будет доступен вызывающему пакетному файлу, если он использует:

call called.bat

Но он не использовал бы

REM starts a new cmd.exe process
start called.bat   

REM stops and replaces current cmd.exe process with a new one
called.bat        
Кен
источник