Кілька способів викликати командний файл 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: start called.bat

Мені дуже важко розмежувати їхнє передбачуване використання на основі тексту довідки: коли використовувати який? наприклад, чому я можу використовувати команду 'виклик' замість прямого виклику. Що відрізняється?

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

Примітка. Я використовую Windows XP SP3.

Відповіді:


101
  1. Пакетний файл буде виконуватися поточним екземпляром cmd.exe (або новим екземпляром cmd.exe, якщо, наприклад, двічі клацнути в Провіднику).

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

  3. Запускає командний файл у новому екземплярі cmd.exe.

  4. Start запустить командний файл у новому екземплярі cmd.exe у новому вікні, і абонент не буде чекати завершення.


7
Примітка для варіанту 4, команда start завжди повинна супроводжуватися "заголовком" , тому, якщо вам не потрібен заголовок, у вас повинні бути порожні подвійні лапки, наприкладstart "" [options] command
Дарин

@Daryn у цьому посиланні просто згадує, що ви завжди повинні мати його, але навіть каже, що Microsoft описує параметр як необов’язковий. Вони не можуть сказати мені, чому це потрібно "вимагати". Навіть кілька їх прикладів внизу опускають параметр title.
Адам Плочер

5

З коментарів тут не зрозуміло одне: Коли ви викликаєте один пакетний файл з іншого, використовуючи лише його назву (випадок №1 у вихідному запитанні), виконання зупиняється із викличного пакетного файлу. Наприклад, у цих рядках:

called.bat
echo Hello

Рядок "echo Hello" (і все, що слідує за ним) не буде викликано. Якщо ви використовуєте ключове слово "виклик", виконання поновлюється після дзвінка. Отже, у цьому випадку:

call called.bat
echo Hello

Буде викликано рядок "echo Hello".

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

Уявіть собі файл 'called.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        
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.