2010-09-20 14 views
6

devo problema circa IF ELSE nello script Batch Command ...Se il problema ELSE comando batch

In Blocco note:
Codice:

:CHECKACCOUNT 
if /I "%user%"=="insertusername" (GOTO :ACCOUNT) ELSE (GOTO :CHECKPASSACCT) 

:CHECKPASSACCT 
if /I "%pass%"=="insertpassword" (GOTO :ACCOUNT) ELSE (GOTO :COUNTER) 

al comando:
Codice:

(al momento non era possibile.

pieno Codice Script:

@echo off 

::SETTINGS::::::::::::::::::::::: 
set filetxt =userpass.txt 
set log=logfile.log 
set timer=900 
::set default = true 
::set user = 0 
::set pass = 0 
::::::::::::::::::::::::::::::::: 


:STARTER 
ECHO.>>%log% 
ECHO ========START========>>%log% 
SetLocal EnableDelayedExpansion 
Set n= 
Set _InputFile=%filetxt% 
For /F "tokens=*" %%I IN (%_InputFile%) DO (
Set /a n+=1 
Set acct!n!=%%I 
) 
set router_ip=%acct1% 
set user=%acct2% 
set pass=%acct3% 
GOTO :CHECKFILE1 


:CHECKFILE1 
CLS 
IF EXIST curl.exe (GOTO :CHECKFILE2) else (
ECHO ERROR: curl.exe was not found.>>%log% 
ECHO ERROR: curl.exe was not found. 
ECHO. 
ECHO. 
GOTO :PAUSEEXIT 
) 

:CHECKFILE2 
CLS 
IF EXIST sleep.exe (GOTO :CHECKACCOUNT) else (
ECHO ERROR: sleep.exe was not found.>>%log% 
ECHO ERROR: sleep.exe was not found. 
ECHO. 
ECHO. 
GOTO :PAUSEEXIT 
) 

:CHECKACCOUNT 
if /I "%user%"=="insertusername" GOTO ACCOUNT 
GOTO CHECKPASSACCT 

:CHECKPASSACCT 
if /I "%pass%"=="insertpassword" GOTO ACCOUNT 
GOTO COUNTER 

:ACCOUNT 
CLS 
::if %default% = true (GOTO :COUNTER) ELSE (
ECHO To edit/change USERNAME and PASSWORD... Please type: OPTION 
ECHO. 
SET /P user="Please enter the username of your Router:" 
IF /I %user%==OPTION (Goto :EDITBAT) 
CLS 
ECHO To edit/change USERNAME and PASSWORD... Please type: OPTION 
ECHO. 
SET /P pass="Please enter the password of your Router:" 
IF /I %pass%==OPTION (Goto :EDITBAT) 
CLS 
set /a i = 1 
GOTO :CHECKACCOUNT 
::) 

:EDITBAT 
start /WAIT notepad %filetxt% 
set router_ip=%acct1% 
set user=%acct2% 
set pass=%acct3% 
GOTO :CHECKACCOUNT 

:COUNTER 
IF %i%==0 (GOTO :RESETROUTER) ELSE (
ECHO WAIT %i% seconds... 
sleep 1 
set /a i = i - 1 
CLS 
GOTO :COUNTER 
) 


:RESETROUTER 
CLS 
ECHO READY to RESET.... 
ECHO Preparing.... 
sleep 2 

sleep 2 
CLS 
ECHO Processing.... 
sleep 5 

sleep 2 
CLS 
ECHO Success.... 
sleep 5 
set /a i = %timer% 
CLS 
GOTO :COUNTER 

:PAUSEEXIT 
PAUSE 

:EXIT 
ECHO.>>%log% 
ECHO ========END OF LOG FILE========>>%log% 

risposta

8

È possibile semplificare questo fino a:

:CHECKACCOUNT 
if /I "%user%"=="insertusername" GOTO ACCOUNT 
GOTO CHECKPASSACCT 

:CHECKPASSACCT 
if /I "%pass%"=="insertpassword" GOTO ACCOUNT 
GOTO COUNTER 

non sono necessari I ELSE dichiarazioni. Poiché il blocco IF passa da un'altra posizione, il secondo GOTO nella riga successiva o in un blocco ELSE deve essere equivalente.

Inoltre, quando si definisce un target GOTO ma non quando si fa riferimento al nome di destinazione all'interno dell'istruzione GOTO, sono necessari i due punti iniziali.

+1

In realtà, se non c'è alcun codice tra i due blocchi, è possibile semplificarlo ulteriormente e rimuovere la riga 'GOTO CHECKPASSACCT' e la riga': CHECKPASSACCT'. – bta

+0

continua a non funzionare: (..... Cerca codice script completo ... – user453089

+0

Quando dici che non funziona ancora, quale errore ti dà e su quale riga si verifica l'errore? Non può essere lo stesso errore, dal momento che l'offendente '(' non esiste più. – bta

14

L'errore visualizzato è dovuto a una formattazione errata. Non mettere tutto su 1 riga. Invece usare questo:

if /I "%user%"=="insertusername" (
    GOTO :ACCOUNT 
) ELSE (
    GOTO :CHECKPASSACCT 
) 

La ragione di fondo più profonda è: goto :somewhere comando deve essere terminato con una nuova riga.

+0

Se preferisci @pipitas anser su @bta in quanto è più semplice e non fa il side-step della domanda del comportamento 'else'. Entrambe le risposte sono comunque buone. Solo una nota a margine, ma ho notato un comportamento strano chiamare 'goto' all'interno di un ciclo in cui si dirama su una riga direttamente sopra un'istruzione' if'. In quei casi, stranamente, ponendo un 'echo nul> nul' o qualcosa di simile tra la destinazione e l'istruzione 'if' funziona come un incantesimo. – kikuchiyo

+0

Grazie per aver fornito una buona ragione per il comportamento. – Raligan

+2

Un po 'tardi, ma la descrizione è sbagliata. La sintassi è corretta, è assolutamente valido usare 'if" 1 "==" 1 "(goto: label1) ELSE (goto: label2)'. 'goto' non ha bisogno di una nuova riga – jeb

0

Non è necessario utilizzare le parentesi. Si sta fondamentalmente dicendo il sistema "se% utente% è insertusername (" e sta chiedendo "che cosa è il '(' dovuto fare?"

+0

WRONG, il primo blocco di parentesi deve essere usato qui per costruire un blocco di comandi. Senza la parentesi ELSE non può essere analizzato (sarà parte del comando 'goto') e' IF' non è riuscito per le condizioni 'false' – jeb

3

Il problema non ha nulla a che fare con il codice mostrato!

il problema è

:COUNTER 
IF %i%==0 (GOTO :RESETROUTER) ELSE (

come variabile i non è definito, la linea sarà ampliato a

IF ==0 (GOTO :RESETROUTER) ELSE (

che è espressione valida .

Per trovare errori di sintassi così semplici, è necessario abilitare il debug con ECHO ON.