Как создать пакетный файл, который должен выполнять команду только после успешного выполнения предыдущей команды?
решение1
Зависит от того, что вы подразумеваете под успешным. Если хотите проверить, foo.exe
не вернули ли вы что-нибудькод выходакроме 0, используйте:
@echo off
start /wait foo.exe
if errorlevel 0 (
start /wait bar.exe
)
для запуска bar.exe
после foo.exe
возвращаемого кода выхода 0
. Вы можете пропустить start /wait
, если тестируемое вами приложение является консольным, а не десктопным.
Более подробная информация по этому вопросу:Как получить код выхода приложения из командной строки Windows?, в ответахСамуэль РенкертиГарри.
решение2
кроме решения errorlevel, опубликованного Hex и улучшенного комментарием Майкла.
Этот вариант еще быстрее справится с тем, что вам нужно.
первая команда && вторая команда
Вторая команда будет выполнена только в том случае, если первая команда была выполнена успешно, т. е. если первая команда не вернула ошибку.
В примере ниже dir asfsds возвращает этот вывод, но также возвращает ошибку
Если вы выполните dir asdfsss & blah, то он запустит blah независимо от того, вернула ли первая команда (dir sdsdf) ошибку или нет.
Но если вы запустите их с && между ними, то если первое является ошибкой, то второе не будет запущено. Это основано на идее булевой алгебры: если A истинно и B истинно, то A AND B истинны. Таким образом, чтобы узнать, истинны ли A и B, вы можете проверить A и B, или вы можете быть «ленивыми» или эффективными, и просто проверить одно, и если оно ложно, вы знаете, что все выражение ложно. А если оно истинно, то вы должны проверить и другое. Таким образом, A && B проверяет A и проверяет B только в том случае, если ему нужно проверить B, то есть проверяет B только в том случае, если B истинно. Но эта концепция булевой алгебры применяется к командам, поэтому она запускает первую, первая может вернуть ошибку, а может и нет, и если первая возвращает ошибку, то она не будет пытаться запустить и проверить вторую, а если первая не возвращает ошибку, то она попытается выполнить вторую. Несомненно, само выражение вернет значение true (нет ошибки), если оба значения истинны, и false (ошибка) в противном случае.
C:\Users\user>dir asdfsdf
Том на диске C не имеет метки. Серийный номер тома B411-D580Каталог C:\Users\user
Файл не найден <---------------- См. вывод dir asdfdsds выше
C:\Users\user>dir asdfsdf & echo a
Том на диске C не имеет метки. Серийный номер тома B411-D580Каталог C:\Users\user
Файл не найден <--- см. «echo a» побежал
C:\Users\user>dir asdfsdf && echo a
Том на диске C не имеет метки. Серийный номер тома B411-D580Каталог C:\Users\user
Файл не найден
C:\Пользователи\пользователь>
Если вы сделали dir filethatexists && echo a, то вы увидите, что первая команда выполняется успешно, а затем выполняется echo a. Аналогично echo a && echo b