ЕСЛИ ЕЩЕ ПРОБЛЕМА КОМАНДНАЯ ГРУППА - PullRequest
8 голосов
/ 20 сентября 2010

У меня проблема с IF ELSE в командном сценарии ...

В блокноте:
Код:

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

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

В КОМАНДЕ:
Код:

(в это время было неожиданно.

ПОЛНЫЙ Код сценария:

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

Ответы [ 4 ]

16 голосов
/ 23 сентября 2010

Ваша ошибка, как видно, связана с неправильным форматированием. Не помещайте все это в 1 строку. Вместо этого используйте это:

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

Более глубокая причина: goto :somewhere команда должна быть завершена символом новой строки.

11 голосов
/ 20 сентября 2010

Вы можете упростить это до:

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

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

Операторы ELSE не нужны.Поскольку блок IF прыгнет куда-то еще, размещение второго GOTO на следующей строке или в блоке ELSE должно быть эквивалентным.

Кроме того, при определении * 1010 необходим двоеточие в начале.* target, но не при обращении к имени цели внутри самого оператора GOTO.

3 голосов
/ 26 апреля 2016

Проблема не имеет ничего общего с показанным кодом!

Проблема в

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

Поскольку переменная i не определена, строка будет расширена до

IF ==0 ( GOTO :RESETROUTER ) ELSE (

Это недопустимое выражение.

Чтобы найти такой простой синтаксис, вы должны включить отладку с помощью ECHO ON.

0 голосов
/ 26 апреля 2016

Вам не нужно использовать скобки. Вы в основном говорите системе «если% user% равен insertusername (» и он спрашивает «что должен делать '('?»

...