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 0
gebruikt, kun je een errorlevel 0
retourneren 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 errorlevel
is 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 Monitor
QueryDirectory
-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 VERIFY
of 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 ErrorLevel
Status 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 ErrorLevel
Status 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 nul
Sindsnoch heeft geen voetafdruk op de uitvoer van de console, noch traagt u in elke maatregel.
Ja, ik ben behoorlijk verveeld
10
Voeg >nul
NA 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.