If/then/else в пакете Windows

В оболочке script у меня есть следующий код:

if echo Mr.32 ; then
  echo Success
else
  echo Failed
  exit
fi

Каков эквивалентный синтаксис для пакетных файлов Windows?

Ответы

Ответ 1

Мне сложно представить, когда ECHO завершится с возвратом ERRORLEVEL, не равным 0. Я предполагаю, что он может выйти из строя, если выход был перенаправлен в файл, а целевой диск заполнен.

CptHammer опубликовал хорошее решение с использованием ERRORLEVEL, хотя он использует GOTO без необходимости. Это можно сделать без использования GOTO:

ECHO Mr.32
if errorlevel 1 (
  echo Failed
  exit /b
) else (
  echo Success
)

Существует более простой способ предпринять действия по УСПЕХУ или НЕИСПРАВНОСТИ любой команды.

command && success action || failure action

В вашем случае

ECHO Mr.32&& (
  echo Success
) || (
  echo Failed
  exit /b
)

Ответ 2

Я думаю, что что-то вроде этого может сделать трюк:

REM run the command
ECHO Mr.32
IF ERRORLEVEL 1 GOTO failLabel

:successLabel
REM put code to execute in case of success here.
ECHO Success
GOTO endLabel

:failLabel
REM put code here that should be executed in case of failure.
ECHO Failed

:endLabel

Это предполагает команду, которую вы хотите протестировать (здесь: echo MR.32) возвращает 0 при успехе и что-то большее при сбое (BEWARE: Echo в большинстве окон не вернет ничего, и поэтому фактическое значение, которое тестируется в этом script - это, вероятно, код возврата из последней команды, выполненной непосредственно перед script. Вероятно, вам лучше проверить с помощью команды: "DIR someFile.txt", которая вернет 0, если somefile.txt существует и 1 в противном случае. )

Это верно, поскольку дбэмэм отметил, что эта структура использует много GOTO. Это связано с тем, что эта структура GOTO является единственной, которая будет хорошо понятна во всех версиях Windows. Более компактные версии появились со временем, но они будут работать только в последних версиях Windows.