2013-12-25 4 views
0

После вызова CMD «echo xxx»% errorlevel% всегда равен 1. Несмотря на то, что «echo xxx» выполнено успешно.Почему возвращаемое значение «эхо» всегда 1

+1

Был ли '% errorlevel%' уже 1 до 'echo'? –

+0

[ERRORLEVEL не% ERRORLEVEL%] (http://blogs.msdn.com/b/oldnewthing/archive/2008/09/26/8965755.aspx). – GSerg

+1

да, похоже, что эхо не влияет на% errorlevel%? – iceKing

ответ

3

Да, 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 
2

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

capture of test on errorlevel

+0

Спасибо за отличный ответ. Тем не менее, если errorlevel равно 0, когда я пытаюсь выполнить команду «echo something» file && echo works || echo failed », даже если« echo something> file »не удалось, уровень ошибок остается 0, а не 1. – iceKing

+0

Фактически, перенаправление если файл заблокирован, а не команда ECHO. Перенаправление происходит до выполнения любой команды. Если перенаправление завершилось неудачно, команда (ы) никогда не будет выполнена. Концепция более очевидна, если вы перенаправляете скобку в заблокированный файл и вставляете несколько команд в круглые скобки. – dbenham

+0

@dbenham: Спасибо, да, это причина для цитат о «неудаче». Но я изменил комментарий о неудаче перенаправления, а не об отказе эха. –

3

внешних команд, как 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 успешно перенаправляется в файл, но устройство хранения не может быть записано по какой-либо причине, например, если устройство заполнено.

+1

Не уверен в других версиях (теперь я могу тестировать только на XP), но внутри .bat-файлов команды 'vol' или' ver' сбрасывают уровень ошибок. И то же самое внутри .cmd –

+0

@MCND - Хорошая точка. Я обновил свой ответ соответственно. – dbenham

Смежные вопросы