После вызова CMD «echo xxx»% errorlevel% всегда равен 1. Несмотря на то, что «echo xxx» выполнено успешно.Почему возвращаемое значение «эхо» всегда 1
ответ
Да, echo something
абсолютно не влияет на уровень ошибок и не будет изменять уровень ошибок до 0, поскольку это всегда будет успешным.
Например:
работает echo something > c:\somefile.txt
, которая на самом деле успех при создании файла, но не изменять ErrorLevel 0.
c:\>copy nil c:
The system cannot find the file specified.
c:\>echo %errorlevel%
1
c:\>echo this.works > c:\test.txt
c:\>echo %errorlevel%
1
type c:\test.txt
this.works
echo
любопытная команда. Давайте посмотрим, как он ведет себя
Когда echo
команда работает
Если Равен 0 до того echo
после echo
, errorlevel
будет 0 (очевидный случай)
Если Равен 1, прежде чем echo
, после echo
, errorlevel
будет 1. Echo не изменяет уровень ошибок
Когда echo
co мм и «сбой»
Может ли эхо выйти из строя? Давайте создадим случай, когда он «сбой». Откройте два окна команд в одном каталоге. Вначале запустите pause > file.txt
, чтобы сгенерировать файл и поместить на него блокировку, пока команда паузы ждет нажатия клавиши. Во втором окне командной строки запустите echo something > file.txt
. В этом случае команда echo
потерпит неудачу, так как в первом командном окне выполняется блокировка файла, поэтому вторая не может записать файл. Правильно говорить о эхо не удалось, но Перенаправление делает, а просто посмотреть, что происходит
Если errorlevel
1 перед запуском echo
, это еще один после echo
(очевидного случая)
Если errolevel
0 перед запуском echo
, он по-прежнему 0 после echo
Итак, кажется, что эхо-команда ведет себя одинаково в обоих случаях
НО если мы изменим путь echo
выполняется в
echo something && echo works || echo fails
то поведение меняется немного
Когда echo
команда работает
никакой разницы. errorlevel
не изменится, сохранив значение, имевшееся до запуска команды echo
.
Когда echo
команда "не удается"
Используя echo something > file && echo works || echo fails
тогда, если errorlevel
равен 1 перед запуском echo
, она сохраняет свое значение.
Но если errorlevel
является 0, и команда echo
выходит из строя, в данном случае, с этой конструкцией команды, errorlevel
покажет неисправность и измените его значение на 1
Спасибо за отличный ответ. Тем не менее, если errorlevel равно 0, когда я пытаюсь выполнить команду «echo something» file && echo works || echo failed », даже если« echo something> file »не удалось, уровень ошибок остается 0, а не 1. – iceKing
Фактически, перенаправление если файл заблокирован, а не команда ECHO. Перенаправление происходит до выполнения любой команды. Если перенаправление завершилось неудачно, команда (ы) никогда не будет выполнена. Концепция более очевидна, если вы перенаправляете скобку в заблокированный файл и вставляете несколько команд в круглые скобки. – dbenham
@dbenham: Спасибо, да, это причина для цитат о «неудаче». Но я изменил комментарий о неудаче перенаправления, а не об отказе эха. –
внешних команд, как Findstr и XCOPY - фактически отдельные программы (FINDSTR.EXE, XCOPY.EXE). Внешние команды устанавливают ERRORLEVEL как с успехом, так и с отказом. По соглашению, 0 указывает на успех, а отличное от нуля указывает на ошибку. Но некоторые программы не могут следовать этому соглашению.
ECHO - это внутренняя команда, означающая, что команда встроена в программу CMD.EXE. Никакой дополнительной программы не требуется. Внутренние команды ведут себя по-разному.
Если используется в командной строке или внутри пакетного скрипта с расширением .BAT, то большинство внутренних команд устанавливают ERRORLEVEL при сбое, но при успешном выполнении ничего не делают с ERRORLEVEL. Однако есть некоторые исключения. И VER, и VOL устанавливают ERRORLEVEL на 0 при успешном завершении.
При использовании в пакетном скрипте с расширением .CMD все внутренние команды устанавливают ERRORLEVEL как с успехом, так и с ошибкой, как и внешние команды.
ERRORLEVEL 1, который вы видите после ECHO, должно происходить из предыдущей команды, которая не удалась. Я никогда не видел, чтобы ECHO терпела неудачу. Единственный способ, которым я могу представить, что это может быть неудачным, - это то, что stdout успешно перенаправляется в файл, но устройство хранения не может быть записано по какой-либо причине, например, если устройство заполнено.
Не уверен в других версиях (теперь я могу тестировать только на XP), но внутри .bat-файлов команды 'vol' или' ver' сбрасывают уровень ошибок. И то же самое внутри .cmd –
@MCND - Хорошая точка. Я обновил свой ответ соответственно. – dbenham
- 1. PHP эхо возвращаемое значение функции
- 2. Всегда возвращаемое значение ноль
- 3. Возвращаемое значение pbinom в функции всегда 0 или 1
- 4. -1 как возвращаемое значение
- 5. Python, -1 возвращаемое значение
- 6. Возвращаемое значение из сценария оболочки без эхо
- 7. Почему regex всегда возвращает 1?
- 8. Возвращаемое значение переключателя всегда 0
- 9. AutoIt - Возвращаемое значение всегда 0
- 10. Почему возвращаемое значение отличается?
- 11. Почему значение в столбце всегда равно 1?
- 12. Эхо-заявка печатает значение «1»
- 13. Почему значение не эхо?
- 14. Почему системный вызов «пауза» всегда возвращает -1?
- 15. Выполнение SPROC - возвращаемое значение = -1
- 16. PHP/JSON Возвращаемое значение 1
- 17. Почему режим всегда 1?
- 18. Почему возвращаемое значение статического нелокального возвращенного указателя всегда равно нулю?
- 19. Почему мое возвращаемое значение неверно?
- 20. MysqlCommand ExecuteNonquery возвращаемое значение всегда 0
- 21. почему всегда ранг 1?
- 22. Почему hasLayout всегда -1?
- 23. Почему ZipEntry.Size всегда -1
- 24. java возвращаемое значение всегда возвращает null
- 25. Почему возвращаемое значение не освобождает
- 26. Почему скобки меняют возвращаемое значение?
- 27. Возвращаемое значение ModalDialog всегда не определено
- 28. Qt ActiveX dynamicCall возвращаемое значение всегда пустой
- 29. Является ли возвращаемое значение всегда временным?
- 30. WPF Dispatcher Invoke возвращаемое значение всегда null
Был ли '% errorlevel%' уже 1 до 'echo'? –
[ERRORLEVEL не% ERRORLEVEL%] (http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx). – GSerg
да, похоже, что эхо не влияет на% errorlevel%? – iceKing