2010-02-04 1 views
6

Ho scritto seguente codicecome usare goto in script batch

setlocal 

set /A sample =1 

:first 

type C:\test.txt | find "inserted" 

if %ERRORLEVEL% EQU 0 goto test 

if %ERRORLEVEL% EQU 1 goto exam 

:test 

echo "testloop" >> C:\testloop.txt 

set /A sample = %sample% + 1 

if %sample% LEQ 4 goto first 

:exam 

echo "exam loop" >> C:\examloop.txt 

endlocal 

ma sta per lable "esame", anche se il livello di errore non è uguale a "1" plz help me

risposta

2

È è necessario elencare i livelli di errore in ordine decrescente (errorlevel2, errorlevel1, errorlevel0 ...).

Vedere this explanation and example.

6

Il tuo problema non è goto, la sua che errorlevel richiede un trattamento speciale, non è come una variabile d'ambiente normale. L'unico test che puoi eseguire con errorlevel è verificare se è maggiore o uguale al valore.

in modo da mettere alla prova errorlevel valori dal più alto al più basso, perché se errorlevel 1 poi if errorlevel 1 sarà vero, ma if errorlevel 0 sarà anche essere vero

setlocal 
set /A sample =1 

:first 
type C:\test.txt | find "inserted" 

if errorlevel 1 goto exam 
if errorlevel 0 goto test 

:test 
echo "testloop" >> C:\testloop.txt 
set /A sample = %sample% + 1 

if %sample% LEQ 4 goto first 

:exam 
echo "exam loop" >> C:\examloop.txt 

endlocal 

se si dispone di estensioni ai comandi abilitati, e là non è una variabile di ambiente chiamata ERRORLEVEL (case insensitive). Quindi in teoria puoi usare% ERRORLEVEL% come una normale variabile d'ambiente. Quindi questo dovrebbe funzionare anche

setlocal EnableExtensions 
set /A sample =1 

:first 
type C:\test.txt | find "inserted" 

if %errorlevel% EQU 1 goto exam 
if %errorlevel% EQU 0 goto test 

:test 
echo "testloop" >> C:\testloop.txt 
set /A sample = %sample% + 1 

if %sample% LEQ 4 goto first 

:exam 
echo "exam loop" >> C:\examloop.txt 
0

Si consiglia di considerare l'utilizzo di ERRORLEVEL come succursali dirette come segue:

setlocal 

set /A sample =1 

:first 

type C:\test.txt | find "inserted" 

**goto :Branch%ERRORLEVEL%** 

:Branch0 

echo "testloop" >> C:\testloop.txt 

set /A sample = %sample% + 1 

if %sample% LEQ 4 goto first 

:Branch1 

echo "exam loop" >> C:\examloop.txt 

endlocal 
0

può essere l'uso || invece di errorlevel per la ramificazione.

setlocal 
set /a sample=1 

:first 
(Type c:\test.txt | find "inserted" >> c:\testloop.txt) || goto :branch1 
set /a sample+=1 
If %sample% leq 4 goto :first 

:brabch1 
Echo "exam loop" >> c:\examloop.txt 
+0

Stephan, grazie t o formattato correttamente, non è il motivo per cui il codice è in formato non appropriato. – user9133538

+0

perché non hai formattato nulla. Vedi [qui] (https://stackoverflow.com/editing-help) per come farlo. – Stephan

0

Modo più semplice da utilizzare per il ciclo.

Per/l %% a in (1,1,4) do (

(tipo c: \ test.txt | trovare “inserito” >> c: \ testloop.txt) || goto: fatto

)

: fatto

Echo “loop esame” >> c: \ examloop.txt

Goto: EOF

+0

Richiede una formattazione. – Billa

+0

@Billa: (s) sta solo leggendo come farlo ';)' – Stephan