Wat is de gemakkelijkste manier om ERRORLEVEL op nul te zetten?

Ik heb een post-build-gebeurtenis die enkele opdrachten uitvoert voor een c#-project. Het laatste commando zorgde er soms voor dat de ERRORLEVEL-waarde niet gelijk was aan nul en dan mislukt de build.

Ik wil een extra commandoregel toevoegen om de ERRORLEVEL-waarde altijd op nul te zetten. Wat is de handigste manier om dat te doen?


Antwoord 1, autoriteit 100%

als je exit /b 0gebruikt, kun je een errorlevel 0retourneren vanuit een child batch-script zonder ook de parent te verlaten.


Antwoord 2, autoriteit 79%

Het lijkt te werken:

ver > nul

Niet alles werkt, en het is niet duidelijk waarom. Het volgende bijvoorbeeld niet:

echo. > nul
cls > nul

Antwoord 3, autoriteit 44%

In een pre- of post-build-gebeurtenis, als de retourcode van een uitvoerbaar bestand groter is dan nul en de aanroep naar het uitvoerbare bestand niet de laatste regel van de pre- of post-build-gebeurtenis is, is dit een snelle manier om demp het en vermijd het activeren van een controle voor een errorlevelis om de falende regel te volgen met een regel die expliciet nul retourneert:

cmd /c "exit /b 0"

Dit is in wezen een generieke combinatie van de eerder genoemde oplossingen die zal werken met meer dan alleende laatste regel van een pre- of post-build evenement.


Antwoord 4, autoriteit 25%

Ik gebruik dit persoonlijk:

cd .

Werkt zelfs in Unix-shell.

Maar deze is misschien wat sneller:

type nul>nul

Omdat Process MonitorQueryDirectory-aanroepen weergeeft op cd .

PS:
cd .heeft nog een leuk neveneffect in de unix-shell. Het herstelt de opnieuw gemaakte werkmap in de terminal als deze is geopend vóór het wissen.

Bijwerken:

En dat is iets sneller:

call;

https://www.dostips.com/forum/viewtopic.php ?t=5542


Antwoord 5, autoriteit 23%

Ik heb ontdekt dat “exit 0” een goede manier lijkt om dit probleem op te lossen.

Gebruiksvoorbeeld:

NET STOP UnderDevService /Y

uitgang 0

als de UnderDevService-service niet is gestart.


Antwoord 6, autoriteit 12%

Ik gebruik VERIFYof VERIFY > nul


Antwoord 7, autoriteit 8%

Als dit een fragment is zoals “Post-build Event” enz., dan is het prima om toe te voegen:

(...) || ver > nul

aan het einde van het laatste commando.

Alternatief

cmd /c "exit /b 0"

is erg duidelijk en niet-idiomatisch — een lezer die de Windows-shell kent, weet wat er aan de hand is en wat je bedoeling was.

Als je echter in een batchscript zit, wil je misschien subrotines gebruiken, die een lichtgewicht equivalent zijn van het “child batchscript” uit het antwoord van akf.

Heb een subroutine:

:reset_error
exit /b 0

en dan gewoon

call :reset_error

waar je het ook nodig hebt.

Hier is een compleet voorbeeld:

@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

Welke uitgangen:

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

Zoals je ziet – alleen bellen en terugkomen via goto:eof is niet genoeg.


8, Autoriteit 3%

Hier zijn enkele andere manieren om de ErrorLevelStatus opnieuw in te stellen, die zelfs in MS-DOS (ten minste voor versie 6.22) werken:

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

De volgende methoden werken alleen in MS-DOS:

command /? > nul
fc nul nul > nul
keyb > nul

Voor de volledigheid is dit de ErrorLevelStatus instellen op 1, geldig voor zowel Windows als MS-DOS:

< nul find ""

9

Na het beoordelen van alle andere antwoorden, besloot ik om te ontdekken welke weg het meest efficiënt was voor het resetten van het ERRORLEVEL. Ik heb een snel script gemaakt dat de tijd heeft opgenomen om elk van deze uit te voeren:

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

Hier is de uitvoer:

CMD / V: ON / C SET ^ “q = ^” ^ “& amp; timeIt.cmd” cmd / c ^! q ^! afsluiten / b 0 ^! q ^! “” CD. “” Ver ” “Type NUL” “verifiëren”

CMD / C “EXIT / B 0” nam 0: 0: 0,02 (0.02s totaal)

CD. Nam 0: 0: 0,00 (0,00s totaal)

Microsoft Windows [versie 10.0.18362.836]

Ver nam 0: 0: 0,00 (0,00s totaal)

Type NUL nam 0: 0: 0,00 (0,00s totaal)

verifiëren is uitgeschakeld.
Verifiëren nam 0: 0: 0,00 (0,00s totaal)


Dit duurde 0: 0: 0.06 (0.06s totaal)

Na het beoordelen met Measure-Command {command}in PowerShell, vond ik dat het alleen echt geaccepteerd is cd .EN cmd /c "exit /b 0"– ik doe iets verkeerd?

Ik zou het cd .of type nulSindsnoch heeft geen voetafdruk op de uitvoer van de console, noch traagt ​​u in elke maatregel.

Ja, ik ben behoorlijk verveeld


10

Voeg >nulNA elke opdracht die waarschijnlijk faalt – dit lijkt te voorkomen dat de build is van falen.

U kunt nog steeds het resultaat van de opdracht controleren door het onderzoeken van %errorlevel%.

Bijvoorbeeld:

findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)

11

Ik gebruik dit:

ping localhost -n 1 & gt; null


12

Ik heb altijd gewoon gebruikt;

set ERRORLEVEL=0

Ik heb het gebruikt voor de jaren van Donkey.

Other episodes