Ответ 1
Этот ответ основан на экспериментах, которые я запускал под Windows 10. Я сомневаюсь, что существуют различия с более ранними версиями Windows, которые используют cmd.exe, но это возможно.
Также обратите внимание: этот ответ не пытается документировать результат ERRORLEVEL, когда внутренняя команда встречает ошибку (за исключением небольшого бита относительно DEL и ERASE)
Не только разница между командами, но одна команда может вести себя по-разному в зависимости от того, была ли она запущена из командной строки или внутри пакета script с расширением .bat
или из пакета script с расширением .cmd
.
Следующий набор команд никогда не очищает ERRORLEVEL до 0 при успехе, независимо от контекста, но вместо этого сохраняет предыдущий ERRORLEVEL:
- BREAK
- CLS
- ECHO
- ENDLOCAL
- FOR: Очевидно, что команды в предложении DO могут устанавливать ERRORLEVEL, но успешное FOR с хотя бы одной итерацией не устанавливает ERRORLEVEL в 0 самостоятельно.
- GOTO
- IF: Очевидно, что команды, выполняемые IF, могут установить ERRORLEVEL, но успешный IF не устанавливает ERRORLEVEL в 0 самостоятельно.
- КЛЮЧИ
- PAUSE
- POPD
- RD
- REM
- RMDIR
- SHIFT
- START
- TITLE
Следующий набор команд всегда удаляет ERRORLEVEL до 0 при успехе, независимо от контекста:
- CD
- CHDIR
- COLOR
- COPY
- DATE
- DEL: всегда очищает ERRORLEVEL, даже если DEL завершает работу (кроме случаев, когда выполняется без аргумента файла).
- DIR
- ERASE: Всегда очищает ERRORLEVEL, даже если ERASE не работает. (за исключением того, что при запуске без аргумента файла).
- MD
- MKDIR
- MKLINK
- MOVE
- PUSHD
- REN
- RENAME
- SETLOCAL
- TIME
- ТИП
- VER
- ПРОВЕРИТЬ
- VOL
Затем появляются эти команды, которые не удаляют ERRORLEVEL при успешном выполнении, если они выданы из командной строки или внутри script с расширением .bat
, но очищают ERRORLEVEL до 0, если они выпущены из script, с .cmd
расширение. Подробнее см. fooobar.com/questions/13336/... и https://groups.google.com/forum/#!msg/microsoft.public.win2000.cmdprompt.admin/XHeUq8oe2wk/LIEViGNmkK0J.
- ASSOC
- DPATH
- FTYPE
- PATH
- ПОДСКАЖИТЕ
- SET
Наконец, есть эти команды, которые не соответствуют аккуратно в любой из предыдущих категорий:
-
CALL: Если CALLed: a: procedure или batch script, то ERRORLEVEL управляется исключительно с помощью CALLed script или:. Но любой другой тип успешного CALL для команды всегда будет очищать ERRORLEVEL до 0, если команда CALLed иначе не устанавливает его.
Пример:call echo OK
. -
EXIT: если используется без
/B
, то сеанс cmd.exe завершается, и больше нет ERRORLEVEL, а только код возврата cmd.exe. Очевидно, чтоEXIT /B 0
очищает ERRORLEVEL до 0, ноEXIT /B
без значения сохраняет предыдущий ERRORLEVEL.
Я считаю, что учет всех внутренних команд, если только нет недокументированной команды, которую я пропустил.