impostando ERRORLEVEL su 0


14

Ho un file batch che è un wrapper attorno a un programma di installazione. Questo file batch controlla il livello di errore restituito dal programma di installazione e stampa di conseguenza.

Ho notato che se eseguo set ERRORLEVEL=0un prompt dei comandi subito prima di dare il via al file batch (nella stessa finestra di comando / ambiente), il programma di installazione non sbaglia mai con il livello di errore e il mio script batch restituisce sempre passato. Suppongo che %ERRORLEVEL%sia una variabile definita da Windows e sia utilizzata specificamente per stampare errori da programmi e script e che l'utilizzo della variabile in un file batch o qualcos'altro sarebbe "a proprio rischio" perché potrebbe essere modificato in qualsiasi momento da un altro processo.

Da quello che sembra, quando imposto il livello di errore in un determinato ambiente, termina in qualche modo l'uso del livello di errore come titolare del codice di uscita. qualcuno sà perche è cosi? Per me è solo uno strano comportamento inaspettato. Qualsiasi informazione sull'argomento sarebbe molto apprezzata!


Risposte:


14

Stai ridefinendo la variabile di sistema in una normale. In questo caso, il sistema non lo utilizzerà fino alla chiusura della sessione di comando.

Il modo migliore sarebbe usare

exit /b 0

in un altro file batch e chiamalo dal tuo script principale. Dove il numero 0 è il tuo desiderato errorlevel. O quello o usa un comando che reimposta il valore errorlevelper te, come echo, findstr ecc.

Ad esempio i seguenti comandi verrebbero tutti impostati ERRORLEVELsu 0 nel file batch:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     

2
Quasi corretto È possibile ottenere il "sistema" per utilizzare ERRORLEVEL dinamico semplicemente definendo qualsiasi valore definito dall'utente utilizzandoset "errorlevel="
dbenham,

Perché Windows consente a qualcuno di ridefinire una variabile di sistema in una normale? Esistono ancora entrambe le definizioni, la sua eco e altri comandi simili ora indicano quella normale? Quindi i programmi potrebbero ancora aggiornare la variabile di sistema, non è accessibile tramite il prompt dei comandi?
user972276

1
"O quello o usa un comando che reimposta il livello di errore per te, come echo, findstr ecc." Il comando echo non reimposta la variabile errorlevel.
antred

Come altri hanno già detto, se la errorlevel variabile è stata impostata "manualmente" dall'utente / batch con "set errorlevel=0", la errorlevelvariabile non rifletterà più il codice di uscita, ma è comunque possibile accedere al codice di uscita con if errorlevel do something.
Kevin Fegan,

(1) Una domanda più generale è "Come posso impostare ERRORLEVEL su un valore arbitrario, come 42?"  cmd /c exit 42 sembra essere la migliore risposta a questo. (2) Come  sottolinea dbenham , non hai bisogno  /bdelle virgolette.
Scott,

12

Non si dovrebbe mai assegnare il proprio valore a variabili di sistema dinamiche come ERRORLEVEL, PATH, CD, DATE, TIME, ecc. In questo modo si impedisce al codice di vedere il valore dinamico. È possibile ripristinare il valore dinamico semplicemente definendo il valore definito dall'utente. Per esempio:

set "errorlevel="

Se si vuole forzare l'errorlevel a 0, quindi è possibile utilizzare questa sintassi totalmente non-intuitivo, ma molto efficace: (call ). Lo spazio dopo la chiamata è critico. Se si desidera impostare il livello di errore su 1, è possibile utilizzare (call). È fondamentale che non ci sia spazio dopo la chiamata.

(call)
echo %errorlevel%
(call )
echo %errorlevel%

Un metodo più intuitivo, ma meno conveniente per impostare il livello di errore consiste nell'utilizzare una subroutine dedicata in un file batch:

call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b

:setErr
exit /b %1

O se sulla riga di comando, è possibile utilizzare

cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%

8

Lo uso personalmente:

cd .

Funziona anche con shell unix.


Ma questo potrebbe essere un po 'più veloce: type nul>nulpoiché Process Monitor mostra le QueryDirectorychiamate su cd .PS: cd .ha un altro piacevole effetto collaterale nella shell unix. Ripristina la directory di lavoro ricreata nel terminale se è stata aperta prima della cancellazione.
Andry,

2

Ecco alcuni altri modi per ripristinare lo ErrorLevelstato, che funzionano anche 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 solo in MS-DOS:

command /? > nul

fc nul nul > nul

Per completezza, questo imposta lo ErrorLevelstato su 1, valido per Windows e MS-DOS:

< nul find ""

1

Questa è l'unica cosa che ho trovato che funziona.

call (exit /b 0)

Necessario in uno script che utilizza script di terze parti che rilevano ERRORLEVEL, ma non ripristina correttamente il livello di errore.


0

Funzioneranno anche: (Imposta il livello di errore su 1)

Metodo 1

color 00

Metodo 2

echo A | find "B"

Puoi anche usarlo per impostare il livello di errore 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.