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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top