как я могу продолжить мой .bat файл после ошибки

30

У меня есть файл .bat в Windows, который делает три вещи

cmd1 arg1 arg2
cmd2 arg3 
cmd3 arg4 arg5 arg6

Иногда cmd1 может выйти из строя, и это нормально, я хотел бы продолжить и выполнить cmd2 и cmd3. Но моя летучая мышь останавливается на cmd1. Как я могу избежать этого?

Обновление для ясности - это не другие файлы .bat, это команды exe. Надеюсь, мне не нужно создавать дерево файлов .bat только для этого.

ConfusedNoob
источник
Вы должны быть в состоянии запустить команду, используя cmd /C.
Der Hochstapler
1
Вам нужно показать конкретный пример кода того, что не работает. Пакетные файлы обычно не завершаются автоматически, если команда завершается с ошибкой. Пакетные файлы завершаются, если есть синтаксическая ошибка. Если ваш код выходит из-за ошибки exe, то в вашем коде должна быть логика, вызывающая такое поведение.
ДБЕНХАМ

Ответы:

18

Другой вариант - использовать амперстенд ( &)

cmd1 & cmd2 & cmd3

Если вы используете double, он продолжается только в случае успешного завершения предыдущей команды ( %ERRORLEVEL%==0)

cmd1 && cmd2 && cmd3

Если вы используете double pipe ( ||), следующая команда запускается, только если предыдущая завершается с кодом ошибки ( %ERRORLEVEL% NEQ 0)

cmd1 || cmd2 || cmd3

Канадский Люк ВОССТАНОВИТЬ МОНИКУ
источник
Могу ли я сделать это при передаче аргументов также? Я просто попытался, и это не сработало.
ConfusedNoob
@ConfusedNoob Я делаю все время ... У меня есть CHKDSKкоманда с аргументами, которая работает. Я печатаю check D: & check E: & check F:, и это работает. Аргументы, которые содержит файл BAT, включают /perf /f /r /b /scanпереключатели
канадец Люк REINSTATE MONICA
2
хороший! принёс мне идею, как реализовать несколько попыток: cmd || cmd || ... будет выполнять следующий cmd, пока не получится
iTake
1
Это делает длинные сценарии нечитаемыми, другого пути нет?
Янв
1
@CanadianLuke Well batch - это пакетная среда Windows. Как вы выполняете сотни команд не в интерактивном режиме? Есть ли лучший подход в силовой оболочке? Это хуже, чтобы двигаться туда?
Янв
11

Предположим, что cmds - это другие .bat-файлы, которые складывают команды следующим образом:

 call cmd1
 call cmd2
 call cmd3
Якорь,
источник
10

Это сработало для меня:

cmd.exe /c cmd1 arg1
cmd2
...

Используется cmd.exeдля выполнения команды в новом экземпляре интерпретатора команд Windows, поэтому неудачная команда не прерывает пакетный сценарий. /cФлаг указывает интерпретатору прекратить , как только команда завершается выполнение.

cmd2выполняется, даже если первая команда не выполнена. Смотрите cmd /?из командной строки Windows для получения дополнительной информации.

Joseph238
источник