Подтвердить что ты не робот

Почему вызов вложенного командного файла без добавления "вызова" к строке выходит из родительского пакетного файла?

Я понимаю, как вызывать вложенные пакетные файлы из родительского файла с помощью команды call, так как на это много ресурсов:

Однако я не понимаю , почему вызов другого командного файла из другого завершает родительский.

Для менее абстрактного примера предположим, что у меня есть пакетный файл, который "связывает" вместе отдельные пакетные файлы, а я ошибочно не добавлял call в каждую строку:

foo.bat
bar.bat

Это выполнит только foo.bat, а затем выйдет. Чтобы правильно выполнить обе команды, я должен был бы добавить вызов перед каждым оператором:

call foo.bat
call bar.bat

Почему первая функциональность все еще существует? Почему он не изменился? Я заметил, что call был представлен в MS-DOS 3.3, который был выпущен в конце 80-х годов, так что эта функциональность все еще здесь для обратной совместимости? Я не могу придумать никаких практических способов его использования, но, возможно, я слишком привык к "новым" методам программирования.

4b9b3361

Ответ 1

DOS использовала простую текстовую обработку (назад, когда у вас были такие вещи, как FILES=20 в config.sys, чтобы разрешить 20 дескрипторов файлов), поэтому открыл файл, прочитал следующую строку, закрыл файл, а затем выполнил только что прочитанную строку. Если файл называется другим, то обработка продолжается с этим файлом, поэтому для пакетного файла потребуется только 1 дескриптор файла.

До тех пор, пока Microsoft не добавила команду call, не было возможности вернуться к исходному файлу (без использования трюков, таких как присвоение имени предыдущего файла в качестве параметра и использование временных файлов, чтобы исходный пакетный файл знаю, что у него была некоторая обработка купола, а затем GOTO следующая часть файла).

Ответ 2

Как писал Шон Чешир, это необходимо для обратной совместимости.

Но запуск командного файла из командного файла без использования CALL не завершает родительский! Это выглядит так, поскольку родитель обычно не будет выполняться дальше после выхода второй партии.
Но, используя вызов перед запуском second.bat, будет показано, что первая партия не завершена.

parent.bat

echo parent.bat
call :myLabel
echo back in parent.bat main
exit /b

:myLabel
second.bat & echo back in parent.bat
exit /b

second.bat

echo second.bat
exit /b

Я использую здесь secpond.bat & echo back ..., чтобы избежать другой ошибки/особенности cmd.exe.
Если вы используете second.bat без каких-либо дополнительных функций, он начнет second.bat И перейти к метке :myLabel в second.bat!

Ответ 3

Call в основном говорит: "Запустите этот другой командный файл, а затем вернитесь сюда и продолжайте". Он был там с DOS 3.3 или около того, и если он был удален, он бы разорвал всю обратную совместимость (поэтому люди все еще используют пакетные скрипты). Его также можно использовать для перехода в :link.

Для информации об использовании и синтаксисе (для будущих ссылок для других) вы можете увидеть эту ссылку MS TechNet

Если вам нужны новые функции, используйте сценарии CMD или скрипты PowerShell.