2010-09-20 6 views
6

Ich habe Probleme über IF ELSE in Command Batch-Skript ...IF ELSE Problem COMMAND BATCH

in dem Editor:
Code:

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

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

In COMMAND:
Code:

(war zu dieser Zeit unerwartet.

FULL Script-Code:

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

Antwort

8

Sie können dies vereinfachen bis:

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

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

Die ELSE Aussagen sind nicht erforderlich. Da der IF Block irgendwo anders springt, sollte der zweite GOTO in der nächsten Zeile oder in einem ELSE Block gleichwertig sein.

Sie benötigen auch den führenden Doppelpunkt, wenn Sie ein GOTO Ziel definieren, aber nicht, wenn Sie innerhalb der GOTO-Anweisung selbst auf den Zielnamen verweisen.

+1

Tatsächlich, wenn es keinen Code zwischen den zwei Blöcken gibt, dann können Sie es weiter vereinfachen und die 'GOTO CHECKPASSACCT' Zeile und die': CHECKPASSACCT' Zeile entfernen. – bta

+0

immer noch nicht funktionieren: (..... Nachschlagen vollständigen Skript-Code ... – user453089

+0

Wenn Sie sagen, dass es immer noch nicht funktioniert, welcher Fehler gibt es Ihnen und welche Zeile tritt der Fehler auf? Es kann nicht sein der gleiche Fehler, da das verursachende '(' nicht mehr existiert. – bta

14

Ihr Fehler, wie gesehen, kommt von falscher Formatierung. Nicht alles auf 1 Zeile setzen. Stattdessen verwenden:

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

Je tiefer, tiefere Grund ist: goto :somewhere muss Befehl durch eine neue Zeile beendet werden.

+0

Wenn @pipitas anser über @bta bevorzugen, wie es einfacher ist und nicht Seite-Schritt die Frage von "else" Verhalten. Beide Antworten sind jedoch gut. Nur eine Randnotiz, aber ich habe merkwürdiges Verhalten bemerkt, das "goto" innerhalb einer Schleife aufruft, wo es zu einer Linie direkt über einer 'if' Aussage abzweigt. In diesen Fällen wirkt sich die Platzierung eines "echo nul> nul" oder ähnlichem zwischen dem Ziel und der if-Anweisung merkwürdig aus. – kikuchiyo

+0

Vielen Dank für einen guten Grund für das Verhalten. – Raligan

+2

Ein bisschen spät, aber die Beschreibung ist falsch. Die Syntax ist korrekt, es ist absolut zulässig, "if" 1 "==" 1 "(goto: label1) ELSE (goto: label2)' zu verwenden. 'goto' benötigt keine neue Zeile – jeb

0

Sie müssen die Klammern nicht verwenden. Sie sagen im Grunde das System „wenn% user% ist insertusername (“ und sie fragt: „Was ist das‚(‘tun soll?“

+0

WRONG, der erste Klammerblock muss hier verwendet werden, um einen Befehlsblock zu erstellen. Ohne die Klammer kann der ELSE nicht geparst werden (er wird Teil des Befehls "goto" sein) und der "IF" ist für "falsche" Bedingungen fehlgeschlagen – jeb

3

Das Problem nichts mit dem gezeigten Code zu tun hat!

das Problem ist bei

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

als die Variable i nicht definiert ist, wird die Zeile zu

IF ==0 (GOTO :RESETROUTER) ELSE (

erweitert werden, dass ein ungültiger Ausdruck ist .

Um zu finden, dass eine solche einfache Syntax fehlschlägt, sollten Sie das Debuggen mit ECHO ON aktivieren.