Кой е най-лесният начин за нулиране на ERRORLEVEL?

Имам събитие след компилация, което изпълнява някои команди за c# проект. Последната команда понякога причинява стойността на ERRORLEVEL да не е равна на нула и след това компилацията се проваля.

Искам да добавя допълнителен ред от команда, за да задам винаги стойността ERRORLEVEL на нула. Кой е най-удобният начин да направите това?


person user95319    schedule 11.07.2009    source източник
comment
Компилацията всъщност не се проваля, само IDE изглежда така.   -  person Dykam    schedule 11.07.2009
comment
Осъзнавам, че това е доста стара публикация... Имах успех в нулирането на нивото на грешка до 0, като издадох командата тип nul след последната команда. Просто почувствах, че може да е от полза.   -  person Arun    schedule 21.08.2013


Отговори (13)


ако използвате exit /b 0, можете да върнете errorlevel 0 от дъщерния пакетен скрипт, без също да излизате от родителския.

person akf    schedule 11.07.2009
comment
От всички предложени решения това вероятно е най-доброто. Ще хвърля този ред в скрипт resetErrorlevel.bat. Като цяло, фактът, че човек трябва да положи такива усилия, за да направи нещо толкова тривиално като изчистване на нивото на грешка на скрипт, е още едно доказателство, че изобретателят на пакетното програмиране на Windows трябва да бъде преследван и наказан сурово. ;) - person antred; 23.03.2015

Изглежда, че върши работа:

ver > nul

Не всичко работи и не е ясно защо. Например, следните не:

echo. > nul
cls > nul
person Jason Kresowaty    schedule 11.07.2009
comment
Мисля, че причината, поради която echo и cls не работят, е, че те са вградени команди в shell, а не реални програми. - person user95319; 11.07.2009
comment
Ще ви дам това, но къде е ver.exe? - person Jason Kresowaty; 11.07.2009
comment
И аз не мога да намеря ver.exe или ver.com. Не знам как да го обясня. - person user95319; 12.07.2009
comment
В пакетния команден ред ver връща версията на MS Windows, напр. Microsoft Windows [Версия 6.1.7601]. - person AnneTheAgile; 29.05.2013
comment
ако стартирате помощ в командната обвивка, ще видите, че ver също е вградена команда - person baye; 03.06.2014
comment
@BaiyanHuang - Почти съм сигурен, че "ver" е вътрешна команда, но как можете да различите от "help"? Много от командите, изброени в "help", са външни команди като: Find.exe, Findstr.exe, Help.exe, Subst.exe, Wmic.exe, Xcopy.exe, ... - person Kevin Fegan; 09.07.2016

В събитие преди или след компилация, ако кодът за връщане на изпълним файл е по-голям от нула и извикването на изпълнимия файл не е последният ред на събитието преди или след компилацията, бърз начин да го заглушите и да избегнете задействането на проверка за ненулево errorlevel е да се следва неуспешният ред с ред, който изрично връща нула:

cmd /c "exit /b 0"

Това по същество е обща комбинация от гореспоменатите решения, които ще работят с повече от само последния ред на събитие преди или след изграждането.

person Jeffrey Wilges    schedule 09.01.2010
comment
благодаря, това свърши работа за мен. по-лесно звучащото предложение за „изход 0“ по-горе не го прави, тъй като искам да продължа да правя неща след нулиране на нивото на грешка, а не изход - person madoki; 30.11.2011
comment
още по-фантастично: можете да използвате <some failing command> || cmd /c "exit /b 0" като един ред. - person Alyssa Haroldsen; 13.07.2013
comment
Харесвам този метод за настройване на произволно ниво на грешка като: cmd /c "exit /b 9009", но изглежда малко пресилено да го задам на 0. Няма ли ver > nul (вътрешна команда), да работи също толкова добре с по-малко режийни разходи, отколкото зареждането на друго копие на командната обвивка с cmd /c "exit /b 0"? - person Kevin Fegan; 09.07.2016
comment
/b не е необходим, така че cmd /c “exit 0” също работи добре. - person Ross Smith II; 14.11.2018
comment
Харесва ми, че този върши работа. Благодаря. Едно забавно нещо, проследявам някакъв файл и моето ниво на грешка продължава да се променя на 1, накрая открих, че подканването на потребителя като (set /p id=enter id) променя нивото на грешка на 1! ... бях попълнил b - person A Khudairy; 19.10.2020

Открих, че "изход 0" изглежда като добър начин за справяне с този проблем.

Пример за употреба:

NET STOP UnderDevService /Y

изход 0

ако услугата UnderDevService не е стартирана.

person user95319    schedule 11.07.2009
comment
не и ако искате да стартирате пакетния файл от командния ред, тъй като изход 0 ще затвори прозореца. cmd /c exit /b 0, както е предложено по-долу, е много по-изгодно - person madoki; 30.11.2011

Аз лично използвам това:

cd .

Работи дори в unix shell.

Но този може да е малко по-бърз:

type nul>nul

Тъй като Process Monitor показва QueryDirectory повиквания на cd .

PS: cd . има друг хубав страничен ефект в unix shell. Той възстановява пресъздадената работна директория в терминала, ако е била отворена преди изтриването.

person Andry    schedule 22.07.2017

Използвам VERIFY или VERIFY > nul

person ixe013    schedule 02.05.2012

Ако това е фрагмент като „Събитие след компилация“ и т.н., тогава ще бъде добре да добавите:

(...) || ver > nul

в края на последната команда.

Алтернативно

cmd /c "exit /b 0"

е много чист и неидиоматичен -- читател, който познава обвивката на Windows, ще разбере какво се случва и какво е било вашето намерение.

Въпреки това, ако сте в партиден скрипт, може да искате да използвате субротини, които са лек еквивалент на „детския пакетен скрипт“ от отговора на akf.

Има подпрограма:

:reset_error
exit /b 0

и тогава просто

call :reset_error

навсякъде, където имате нужда.

Ето пълен пример:

@echo off
rem *** main ***

call :raise_error
echo After :raise_error ERRORLEVEL = %ERRORLEVEL%

call :empty
echo After :empty ERRORLEVEL = %ERRORLEVEL%

call :reset_error
echo After :reset_error ERRORLEVEL = %ERRORLEVEL%

:: this is needed at the end of the main body of the script
goto:eof

rem *** subroutines ***

:empty
goto:eof

:raise_error
exit /b 1

:reset_error
exit /b 0

Кои изходи:

After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0

Както виждате - просто обаждане и връщане чрез goto:eof не е достатъчно.

person Tomasz Gandor    schedule 11.10.2016

Следното работи в съвременни Windows (базирани на NT) системи, които разполагат с cmd.exe:

rem /* This clears `ErrorLevel`; the SPACE can actually be replaced by an
rem    arbitrary sequence of SPACE, TAB, `,`, `;`, `=`, NBSP, VTAB, FF: */
(call )

ИНТЕРВАЛ (или по-точно, произволна последователност от един или повече стандартни разделители на токени, които са ИНТЕРВАЛ (код 0x20), ТАБ (код 0x09), ,, ;, =, NBSP (код 0xFF), VTAB (код 0x0B) и FF (код 0x0C)) е задължително ; ако го пропуснете, вместо това се задава ErrorLevel:

rem // This sets `ErrorLevel` to `1`:
(call)

Има хубава тема на DosTips.com, където се появи тази техника.


Ето алтернативен метод, но който има достъп до файловата система и следователно може да е малко по-бавен:

dir > nul

rem /* Perhaps this is a little faster as a specific file is given rather 
rem    than just the current directory (`.` implicitly) like above: */
dir /B "%ComSpec%" > nul
person aschipfl    schedule 21.10.2020

Ето някои други начини за нулиране на състоянието ErrorLevel, които работят дори в MS-DOS (поне за версия 6.22):

more < nul > nul

rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul

Следните методи работят само в MS-DOS:

command /? > nul

fc nul nul > nul

keyb > nul

За пълнота това задава състоянието ErrorLevel на 1, валидно както за Windows, така и за MS-DOS:

< nul find ""
person aschipfl    schedule 19.02.2019

След като прегледах всички останали отговори, реших да намеря кой начин е най-ефективният за нулиране на ERRORLEVEL. Направих бърз скрипт, който записва времето за изпълнение на всяко от тези:

"cmd /c "exit /b 0"", "cd .", "ver", "type nul", and "VERIFY"

ето изхода:

cmd /v:on /c set ^"q=^"^" & timeit.cmd "cmd /c ^!q^!exit /b 0^!q^!" "cd ." "ver" "type nul" „ПОТВЪРДИ“

cmd /c "изход /b 0" отне 0:0:0.02 (общо 0.02s)

cd . взе 0:0:0.00 (общо 0.00s)

Microsoft Windows [Версия 10.0.18362.836]

версия отне 0:0:0.00 (общо 0.00s)

тип nul отне 0:0:0.00 (общо 0.00s)

VERIFY е изключен. VERIFY отне 0:0:0.00 (общо 0.00s)


Това отне 0:0:0.06 (общо 0.06s)

след като прегледах с Measure-Command {command} в Powershell, открих, че наистина приема само cd . и cmd /c "exit /b 0" --правя ли нещо нередно?

Бих препоръчал cd . или type nul, тъй като нито имат отпечатък върху изхода на конзолата, нито са бавни в каквато и да е мярка.

да, доста ми е скучно

person alexlyee    schedule 15.05.2020
comment
Да, cmd /C exit [/B] 0 трябва да е най-бавният, тъй като се отваря и затваря нов екземпляр cmd.exe; останалите са вътрешни команди, така че няма достъп до файловата система за намиране на изпълними файлове... - person aschipfl; 21.10.2020

Добавете >nul след всяка команда, която има вероятност да се провали - това изглежда предотвратява неуспеха на компилацията.

Все още можете да проверите резултата от командата, като разгледате %errorlevel%.

Например:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
person Chiefy    schedule 15.04.2010
comment
Това няма да работи -- обвивката оценява целия команден ред наведнъж, така че %errorlevel% ще бъде заменен, преди да се изпълни командата findstr. Използвайте if errorlevel 1 вместо това, за да тествате за ненулево ниво на грешка. - person UweBaemayr; 03.03.2016
comment
Вероятно вашият CI сървър не успее да се изгради, ако например намери грешка в низа в стандартния изход / стандартна грешка. Не нулираш статуса. Просто заглушаваш командата. За по-дълбока тишина използвайте ›nul 2›nul - person Tomasz Gandor; 12.10.2016

Аз използвам това:

ping localhost -n 1 >нулев

person Piotr Domanski    schedule 16.02.2015

Винаги използвах само;

set ERRORLEVEL=0

Ползвам го от магарешки години.

person cirrus    schedule 04.12.2014
comment
Лесно е, но е наистина лоша идея, тъй като това създава променлива с име errorlevel, която наслагва вътрешната псевдо променлива errorlevel - person jeb; 04.12.2014
comment
Крики, прав си! Уау, изглежда, че избягвам куршуми от години :) - person cirrus; 04.12.2014