2012-10-23 6 views
7

Ho riscontrato la necessità di segnalare un livello di errore a un programma che chiama script batch.Impostazione di programmazione batch ERRORLEVEL da comando FIND fallito

Lo script creerà un file di registro CSV che desidero controllare per visualizzare se lo script è stato eseguito correttamente.

Quello che vorrei dire è qualcosa di simile

IF NOT FIND "[ERR" "test.csv" 

o di dire, che se la stringa "[ERR" non è nell'output ERRORLEVEL = 0 ELSE ERRORLEVEL = 1

Spero che questo ha un senso. Sono sicuro che è semplice, ma impostare i livelli di errore sembra essere un dolore reale in un $ se!

risposta

10

TROVARE "[ERR" "text.csv" imposta ERRORLEVEL su 0 se viene trovato almeno uno [ERR e 1 se non viene trovato [ERR. Hai bisogno di un modo per invertire la logica.

Se tutto quello che vogliamo fare è restituire immediatamente 0 se non [ERR trovato, o 1 se almeno uno [ERR trovato, quindi vorrei utilizzare il seguente:

find "[ERR" "test.csv" >nul && exit /b 1 || exit /b 0 

Se si desidera catturare il risultato in una variabile da restituire in seguito, quindi:

find "[ERR" "test.csv" >nul && set "err=1" || set "err=0" 

o

find "[ERR" "test.csv" >nul 
set /a "err=!%errorlevel%" 

Quando si è pronti per restituire il risultato

exit /b %err% 

Qui di seguito è la mia risposta originale che è stata accettata, ma è stato imbarazzante sbagliato :-(
Grazie Corey per sottolineare l'errore logico . Come dice nel suo commento, il codice di errore riportato in seguito segnalerà un errore solo se tutte le righe hanno il testo [ERR.

FIND imposta ERRORLEVEL su 0 se trovato, 1 se non trovato. Per invertire la logica , utilizzare semplicemente l'opzione/V.

find /v "[ERR" "test.csv" >nul 

Se si dispone di un set variabile che indica l'errorlevel, allora si può uso EXIT/B per impostare l'ERRORLEVEL

set err=1 
exit /b %err% 
+0

Ciao dbenham, grazie per la tua risposta ma sfortunatamente aggiungendo/V sembra che il parametro Errorlevel sia sempre impostato su 0. Inoltre, ho provato a utilizzare questo file batch per testare la seconda risposta.FIND "[ERR" " test.csv "SET MYERROR = 1 EXIT/B% MYERROR% dovrebbe sempre restituire 1 quando echo% errorlevel% ma lo farà solo se [ERR non è nel file test.csv! Sto facendo qualcosa di sbagliato con la sintassi? Tutte e 3 le affermazioni sono su linee separate ma non riesco a iniziare una nuova riga per rappresentarlo! grazie in anticipo della tua risposta! –

+2

dbenham! Dopo averlo ripetuto di nuovo, ho scoperto che avevo fatto quello che è un errore di scolaro DOS! Ho messo impostato err = 1 invece di err = 1. Per chiunque altro stia leggendo questo, ciò significa che, quando si digita SET ERR = 1, il nome della variabile è "ERR" e non "ERR". Grazie! –

+1

Specificare '/ V' causerà solo un errore (ERRORLEVEL == 1) se * tutte * le righe nel file contengono il valore specificato. Inverte il test da * contiene x * a * non contiene x *, con ERRORLEVEL pari a 0 se vengono trovate linee che corrispondono al test. – Corey

1

Questa è la logica che ho usato in un BAT file in precedenza.

find "string" "test.txt" > NUL & IF ERRORLEVEL 1 (
    ECHO String was NOT found 
) ELSE (
    ECHO String was found 
) 

È possibile inserire qualsiasi comando desiderato nei blocchi IF/ELSE.

0

Si noti che il comando IF ha la logica che restituisce true se ERRORLEVEL è maggiore o uguale a il seguente numero!Quindi

IF ERRORLEVEL 0 (... 

restituisce true per tutti i comandi FIND. Cosa ti serve se vuoi testare solo se una frase è in un file:

find "string" "test.txt" > NUL & IF NOT ERRORLEVEL 1 ECHO String was found 

Ci ho messo anni a lavorarci!

+0

'&&' è una sorta di scorciatoia per 'SE NOT ERRORLEVEL 1', quindi puoi cambiare la tua linea in:' find "string" "test.txt"> NUL && echo String è stato trovato || echo La stringa non è stata trovata – Stephan