Как запустить несколько файлов .BAT в файле .BAT

У вас может быть интерфейс IMyClass и фабричный метод, который создает и возвращает экземпляр MyClass. Возможно, вам понадобится создать экземпляр с помощью Reflection.

У меня есть пример кода здесь аналогичной ситуации: конечный пользователь только заботится о одном типе параметра, но потребности реализации иметь два. В моем примере мне не нужно использовать Reflection для создания экземпляра, но это похоже на то, что вам может понадобиться.

То, что вы пытаетесь сделать, возможно с использованием конструкций времени компиляции, таких как C ++ шаблонов, но не конструкций времени выполнения, таких как генераторы C #.

633
задан Yvette Colomb 3 February 2019 в 13:08
поделиться

8 ответов

Использование:

call msbuild.bat
call unit-tests.bat
call deploy.bat

Если CALL не используется, текущий пакетный файл останавливается и вызываемый пакетный файл начинает выполняться. Это своеобразное поведение, восходящее к ранним временам MS-DOS.

1116
ответ дан 22 November 2019 в 21:47
поделиться

Следующее решило мою проблему:

start call "batch1.bat"
start call "batch2.bat"
0
ответ дан 22 November 2019 в 21:47
поделиться

Рассматривая ваши имена файлов, рассматривали ли вы возможность использования инструмента сборки, такого как NAnt или Ant (версия для Java) . У вас будет гораздо больше контроля, чем с файлами bat.

7
ответ дан 22 November 2019 в 21:47
поделиться

Чтобы вызвать файл .bat в файле .bat , используйте

call foo.bat

(Да, это глупо, было бы больше смысла если бы вы могли вызвать его с помощью foo.bat , как вы могли бы из командной строки, но правильный способ - использовать call .)

19
ответ дан 22 November 2019 в 21:47
поделиться

Попробуйте:

call msbuild.bat
call unit-tests.bat
call deploy.bat
41
ответ дан 22 November 2019 в 21:47
поделиться
call msbuild.bat
call unit-tests.bat
call deploy.bat
21
ответ дан 22 November 2019 в 21:47
поделиться

Все остальные ответы верны: используйте вызов. Например:

 call "msbuild.bat"

История

В старых версиях DOS не было возможности рекурсивно выполнять командные файлы. Затем была введена команда call, которая вызывала другую оболочку cmd для выполнения командного файла и возвращала выполнение обратно вызывающей оболочке cmd по завершении.

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

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

Как и во многих случаях с Microsoft, обратная совместимость, следовательно, является причиной такого поведения.

Подсказки

Если в именах ваших командных файлов есть пробелы, используйте кавычки вокруг имени:

call "unit tests.bat"

Кстати: если у вас нет всех имен командных файлов, вы также можете использовать для это (это не гарантирует правильный порядок вызовов пакетного файла; он соответствует порядку файловой системы):

FOR %x IN (*.bat) DO call "%x"

Вы также можете реагировать на уровни ошибок после вызова. Используйте:

exit /B 1   # Or any other integer value in 0..255

, чтобы вернуть уровень ошибки. 0 означает правильное выполнение. В вызывающем пакетном файле вы можете отреагировать, используя

if errorlevel neq 0 <batch command>

Используйте , если уровень ошибки 1 , если у вас более старая версия Windows, чем NT4 / 2000 / XP, чтобы отловить все уровни ошибок 1 и выше.

Для управления потоком ошибок пакетный файл, есть goto: - (

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Как указывали другие: взгляните на системы сборки для замены пакетных файлов.

вы также можете использовать для этого (он не гарантирует правильный порядок вызовов пакетного файла; он следует порядку файловой системы):

FOR %x IN (*.bat) DO call "%x"

Вы также можете реагировать на уровни ошибок после вызова. Используйте:

exit /B 1   # Or any other integer value in 0..255

, чтобы вернуть уровень ошибки. 0 означает правильное выполнение. В вызывающем пакетном файле вы можете отреагировать, используя

if errorlevel neq 0 <batch command>

Используйте , если уровень ошибки 1 , если у вас более старая версия Windows, чем NT4 / 2000 / XP, чтобы отловить все уровни ошибок 1 и выше.

Для управления потоком ошибок пакетный файл, есть goto: - (

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Как указывали другие: взгляните на системы сборки для замены пакетных файлов.

вы также можете использовать для этого (он не гарантирует правильный порядок вызовов пакетного файла; он следует порядку файловой системы):

FOR %x IN (*.bat) DO call "%x"

Вы также можете реагировать на уровни ошибок после вызова. Используйте:

exit /B 1   # Or any other integer value in 0..255

, чтобы вернуть уровень ошибки. 0 означает правильное выполнение. В вызывающем пакетном файле вы можете отреагировать, используя

if errorlevel neq 0 <batch command>

Используйте , если уровень ошибки 1 , если у вас более старая версия Windows, чем NT4 / 2000 / XP, чтобы отловить все уровни ошибок 1 и выше.

Для управления потоком ошибок пакетный файл, есть goto: - (

if errorlevel 2 goto label2
if errorlevel 1 goto label1
...
:label1
...
:label2
...

Как указывали другие: взгляните на системы сборки для замены пакетных файлов.

169
ответ дан 22 November 2019 в 21:47
поделиться

Вы вызываете несколько пакетов, чтобы скомпилировать программу. Я считаю само собой разумеющимся, что в случае возникновения ошибки:
1) Программа в пакете завершится с уровнем ошибки;
2) Вы хотите знать об этом.

for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1

'||' проверяет уровень ошибок выше 0. Таким образом, все пакеты вызываются по порядку, но останавливаются при возникновении любой ошибки, оставляя экран таким, какой он есть, чтобы вы могли видеть любое сообщение об ошибке.

27
ответ дан 22 November 2019 в 21:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: