Несколько способов вызвать пакетный файл Windows из другого или из приглашения. Какой в ​​каком случае? - PullRequest
89 голосов
/ 09 апреля 2010

Пакетный файл 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

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

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

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

Ответы [ 2 ]

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

  2. То же, что и # 1, действует только при использовании внутри пакетного / cmd-файла. В пакетном файле без 'call' родительский пакетный файл заканчивается и управление переходит к вызываемому пакетному файлу; с помощью 'call' запускается дочерний пакетный файл, а родительский пакетный файл продолжается с инструкциями после вызова.

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

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

3 голосов
/ 09 марта 2017

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

called.bat
echo Hello

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

call called.bat
echo Hello

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

Кроме того, все переменные, заданные в файле named.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        
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...