2010-09-20 19 views
6

tengo problema sobre ELSE IF en escritura por lotes de comandos ...ELSE comando batch

En Bloc de notas:
Código:

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

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

al mando:
Código:

(era inesperado en este momento.

COMPLETO Código Guión:

@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% 

Respuesta

8

Se puede simplificar esto a:

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

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

no son necesarios Los ELSE declaraciones. Como el bloque IF saltará en otro lugar, colocar el segundo GOTO en la siguiente línea o en un bloque ELSE debe ser equivalente.

Además, necesita el primer punto al definir un objetivo GOTO, pero no cuando se hace referencia al nombre de destino dentro de la propia declaración GOTO.

+1

En realidad, si no hay ningún código entre los dos bloques, puede simplificarlo aún más y eliminar la línea 'GOTO CHECKPASSACCT' y la línea': CHECKPASSACCT'. – bta

+0

todavía no funciona: (..... Busque el código de script completo ... – user453089

+0

Cuando dice que todavía no funciona, ¿qué error le está dando y en qué línea se produce el error? No puede ser el mismo error, ya que el 'ofensivo' ('ya no existe. – bta

14

Su error como se ve proviene de un formateo incorrecto. No lo pongas todo en 1 línea. En su lugar utilizar este:

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

La razón subyacente es más profundo: goto :somewhere comando necesita ser terminada por un salto de línea.

+0

Si prefieres @pipitas anser sobre @bta ya que es más simple y no deja de lado la pregunta del comportamiento 'else'. Ambas respuestas son buenas sin embargo. Solo una nota al margen, pero he notado un comportamiento extraño que llama a 'goto' dentro de un bucle donde se ramifica a una línea directamente sobre una declaración' if'. En esos casos, curiosamente, colocar un 'echo nul> nul' o algo similar entre el destino y la sentencia' if' funciona como un amuleto. – kikuchiyo

+0

Gracias por dar una buena razón para el comportamiento. – Raligan

+2

Un poco tarde, pero la descripción es incorrecta. La sintaxis es correcta, es absolutamente válido usar 'if" 1 "==" 1 "(goto: label1) ELSE (goto: label2)'. 'goto' no necesita una nueva línea – jeb

0

No es necesario que use los paréntesis. Básicamente, se está diciendo al sistema "if% usuario% es insertusername (" Y es preguntar "¿qué es el '(' supone que debemos hacer?"

+0

WRONG, el primer bloque de paréntesis debe usarse aquí para construir un bloque de comandos. Sin el paréntesis, el ELSE no se puede analizar (será parte del comando 'goto') y el' IF' falló para las condiciones 'false' – jeb

3

El problema no tiene nada que ver con el código que se muestra!

el problema está en

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

Como la variable i no está definido, la línea se extenderá a

IF ==0 (GOTO :RESETROUTER) ELSE (

Esa es una expresión no válida .

Para encontrar que la sintaxis simple falla, debe habilitar la depuración con ECHO ON.