Qual è il modo più semplice per ripristinare il livello di errore a zero?
-
12-09-2019 - |
Domanda
Ho un post-build evento che esegue alcuni comandi per un progetto c#.L'ultimo comando, a volte, causa il valore di ERRORLEVEL non è uguale a zero e quindi la generazione non riesce.
Voglio aggiungere un'ulteriore linea di comando per impostare il valore di ERRORLEVEL a zero.Qual è il modo più conveniente per fare che?
Soluzione 4
ho scoperto che "exit 0" si presenta come un buon modo per affrontare questo problema.
Utilizzo Esempio:
NET STOP UnderDevService / Y
exit 0
se il servizio UnderDevService non è avviato.
Altri suggerimenti
se si utilizza exit /b 0
si può restituire un errorlevel 0
all'interno di uno script batch senza bambino anche uscire dal genitore.
Sembra di fare il trucco:
ver > nul
Non tutto funziona, e non è chiaro il perché. Ad esempio, il seguente non lo fanno:
echo. > nul
cls > nul
In un evento di pre o post-generazione, se il codice di ritorno di un eseguibile è maggiore di zero, e la chiamata al file eseguibile non è l'ultima riga della manifestazione pre- o post-generazione, un modo rapido muto e evitare di innescare un assegno per un non nulla errorlevel
è quello di seguire la linea di fallimento con una linea che restituisce in modo esplicito lo zero:
cmd /c "exit /b 0"
Questa è essenzialmente una combinazione generica delle soluzioni precedentemente menzionate che funzionerà con più di solo l'ultima riga di un evento di pre o post-generazione.
Io personalmente uso questo:
cd .
Funziona anche in shell UNIX.
Ma, questo potrebbe essere un po 'più veloce:
type nul>nul
A causa Process Monitor
mostra chiamate QueryDirectory
su cd .
PS:
cd .
ha un altro effetto collaterale nel guscio unix. Non ripristinare directory di lavoro ricreato nel terminale se è stato aperto prima della cancellazione.
Io uso VERIFY
o VERIFY > nul
Se questo è un frammento come "Evento di Post-generazione", etc. quindi ti va bene aggiungendo:
(...) || ver > nul
alla fine dell'ultimo comando.
In alternativa
cmd /c "exit /b 0"
è molto pulito e non idiomatiche -- un lettore che conosce la shell di Windows sa che cosa sta succedendo, e qual'era il tuo intento.
Tuttavia, se siete in uno script batch, è possibile che si desidera utilizzare subrotines, che sono un leggero equivalente del "bambino script batch" da akf risposta.
Hanno una subroutine:
:reset_error
exit /b 0
e poi basta
call :reset_error
ovunque è necessario.
Ecco un esempio completo:
@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
Che uscite:
After :raise_error ERRORLEVEL = 1
After :empty ERRORLEVEL = 1
After :reset_error ERRORLEVEL = 0
Come si può vedere - solo chiamata e ritorno via goto:eof non è sufficiente.
Aggiungi >nul
dopo ogni comando che è probabile che a fallire - questo sembra per prevenire l'accumulo di fallire.
È ancora possibile controllare il risultato del comando esaminando %errorlevel%
.
Ad esempio:
findstr "foo" c:\temp.txt>nul & if %errorlevel% EQU 0 (echo found it) else (echo didn't find it)
Ecco alcuni altri modi per ripristinare lo stato ErrorLevel
, che anche il lavoro in MS-DOS (almeno per la versione 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
I seguenti metodi funzionano in MS-DOS solo:
command /? > nul
fc nul nul > nul
Per ragioni di completezza, tale imposta lo stato ErrorLevel
a 1
, valido sia per Windows e MS-DOS:
< nul find ""
Sto usando questo:
ping localhost -n 1> Null
ho sempre solo usato;
set ERRORLEVEL=0
ho usato per anni d'asino.