У вас может быть интерфейс IMyClass
и фабричный метод, который создает и возвращает экземпляр MyClass
. Возможно, вам понадобится создать экземпляр с помощью Reflection.
У меня есть пример кода здесь аналогичной ситуации: конечный пользователь только заботится о одном типе параметра, но потребности реализации иметь два. В моем примере мне не нужно использовать Reflection для создания экземпляра, но это похоже на то, что вам может понадобиться.
То, что вы пытаетесь сделать, возможно с использованием конструкций времени компиляции, таких как C ++ шаблонов, но не конструкций времени выполнения, таких как генераторы C #.
Использование:
call msbuild.bat
call unit-tests.bat
call deploy.bat
Если CALL не используется, текущий пакетный файл останавливается и вызываемый пакетный файл начинает выполняться. Это своеобразное поведение, восходящее к ранним временам MS-DOS.
Следующее решило мою проблему:
start call "batch1.bat"
start call "batch2.bat"
Рассматривая ваши имена файлов, рассматривали ли вы возможность использования инструмента сборки, такого как NAnt или Ant (версия для Java) . У вас будет гораздо больше контроля, чем с файлами bat.
Чтобы вызвать файл .bat
в файле .bat
, используйте
call foo.bat
(Да, это глупо, было бы больше смысла если бы вы могли вызвать его с помощью foo.bat
, как вы могли бы из командной строки, но правильный способ - использовать call
.)
Попробуйте:
call msbuild.bat
call unit-tests.bat
call deploy.bat
call msbuild.bat
call unit-tests.bat
call deploy.bat
Все остальные ответы верны: используйте вызов. Например:
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
...
Как указывали другие: взгляните на системы сборки для замены пакетных файлов.
Вы вызываете несколько пакетов, чтобы скомпилировать программу.
Я считаю само собой разумеющимся, что в случае возникновения ошибки:
1) Программа в пакете завершится с уровнем ошибки;
2) Вы хотите знать об этом.
for %%b in ("msbuild.bat" "unit-tests.bat" "deploy.bat") do call %%b|| exit /b 1
'||' проверяет уровень ошибок выше 0. Таким образом, все пакеты вызываются по порядку, но останавливаются при возникновении любой ошибки, оставляя экран таким, какой он есть, чтобы вы могли видеть любое сообщение об ошибке.