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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

called.bat
echo Hello

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

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