Jaki jest najprostszy sposób na zresetowanie poziomu błędu do zera?

Mam Zdarzenie post-build, które uruchamia kilka poleceń dla projektu c#. Ostatnie polecenie czasami powodowałoby, że wartość ERRORLEVEL nie jest równa zeru, a następnie kompilacja nie powiodła się.

Chcę dodać dodatkowy wiersz polecenia, aby zawsze ustawić wartość błędu na zero. Jaki jest na to najwygodniejszy sposób?

Author: Ross Ridge, 2009-07-11

10 answers

Jeśli użyjesz exit /b 0, możesz zwrócić errorlevel 0 wewnątrz podrzędnego skryptu wsadowego bez wychodzenia z rodzica.

 59
Author: akf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-23 15:48:20

Wydaje się robić sztuczkę:

ver > nul
Nie wszystko działa i nie jest jasne dlaczego. Na przykład, następujące nie:
echo. > nul
cls > nul
 44
Author: Jason Kresowaty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-11 13:36:50

W zdarzeniu pre - lub post-build, jeśli kod zwracany przez program wykonywalny jest większy niż zero, a wywołanie programu wykonywalnego nie jest ostatnią linią zdarzenia pre-lub post-build, szybkim sposobem wyciszenia go i uniknięcia sprawdzenia niezerowej errorlevel jest podążanie za nieudaną linią z linią, która jawnie zwraca zero:

cmd /c "exit /b 0"

Jest to zasadniczo ogólna kombinacja wcześniej wymienionych rozwiązań, które będą działać z więcej niż tylko Ostatni wiersz pre - lub zdarzenie po zbudowaniu.

 24
Author: Jeffrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 23:21:36

Stwierdziłem, że "wyjście 0" wygląda na dobry sposób na rozwiązanie tego problemu.

Przykład Użycia:

NET STOP UnderDevService / Y

Exit 0

Jeśli usługa UnderDevService nie jest uruchomiona.

 15
Author: user95319,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-01 20:20:51

Używam VERIFY LUB VERIFY > nul

 6
Author: ixe013,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-02 01:37:57

Ja osobiście używam tego:

cd .

Działa nawet w powłoce Uniksa.

Ale ten może być trochę szybszy:

type nul>nul

Ponieważ Process Monitor pokazuje QueryDirectory wywołuje cd .

PS: cd . mA kolejny ładny efekt uboczny w powłoce Uniksa. Przywraca odtworzony katalog roboczy w terminalu, jeśli został otwarty przed usunięciem.

 6
Author: Andry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-02 10:21:25

Jeśli jest to fragment typu "post-build Event" itp., wtedy będzie dobrze:

(...) || ver > nul

Na końcu ostatniego polecenia.

Alternatywnie

cmd /c "exit /b 0"

Jest bardzo czysty i nie-idiomatyczny-czytelnik, który zna powłokę Windows, będzie wiedział, co się dzieje i jakie były twoje intencje.

Jednak, jeśli jesteś w skrypcie wsadowym, możesz użyć podprotin, które są lekkim odpowiednikiem "podrzędnego skryptu wsadowego" z odpowiedzi akf.

Mieć podprogram:

:reset_error
exit /b 0

A potem po prostu

call :reset_error
Gdziekolwiek tego potrzebujesz.

Oto pełny przykład:

@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

Które wyjście:

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

Jak widzisz-samo wywołanie i powrót przez goto: eof to za mało.

 1
Author: Tomasz Gandor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-11 22:01:38

Dodaj >nul po każdym poleceniu, które może się nie udać - wydaje się to zapobiegać niepowodzeniu kompilacji.

Nadal możesz sprawdzić wynik polecenia, sprawdzając %errorlevel%.

Na przykład:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
 0
Author: Chiefy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-26 12:22:40

Używam tego:

Ping localhost-n 1 >null

 -1
Author: Piotr Domanski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-17 00:13:08

Zawsze używałem;

set ERRORLEVEL=0
Używam go od lat.
 -4
Author: cirrus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-04 16:08:08