Scripting 如果出现问题,命令批处理

Scripting 如果出现问题,命令批处理,scripting,batch-file,command,windows-server,Scripting,Batch File,Command,Windows Server,我对命令批处理脚本中的IF-ELSE有问题 在记事本中: 代码: 在命令中: 代码: (这在当时是出人意料的 完整脚本代码: @echo off ::SETTINGS::::::::::::::::::::::: set filetxt =userpass.txt set log=logfile.log set timer=900 ::set default = true ::set user = 0 ::set pass = 0 :::::::::::::::::::::::::::::::

我对命令批处理脚本中的IF-ELSE有问题

在记事本中:
代码:

在命令中:
代码:

(这在当时是出人意料的

完整脚本代码:

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

您可以将其简化为:

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

:CHECKPASSACCT
if /I "%pass%"=="insertpassword" GOTO ACCOUNT
GOTO COUNTER
不需要
ELSE
语句。由于
IF
块将跳转到其他地方,因此将第二个
GOTO
放在下一行或
ELSE
块中应该是等效的


此外,在定义
GOTO
目标时,您需要使用前导冒号,但在
GOTO
语句本身中引用目标名称时,则不需要使用前导冒号。

您看到的错误来自错误的格式。不要将其全部放在一行。请使用以下方法:

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

更深层次的根本原因是:
goto:where
命令需要换行终止。

您不需要使用括号。您基本上是在告诉系统
“如果%user%是insertusername(“并且它询问“(”应该做什么?”

问题与显示的代码无关!”

问题就在这里

:COUNTER
IF %i%==0 ( GOTO :RESETROUTER ) ELSE (
由于未定义变量
i
,因此该行将扩展为

IF ==0 ( GOTO :RESETROUTER ) ELSE (
这是一个无效的表达式


要想发现这样简单的语法失败,您应该在

上启用
ECHO调试实际上,如果两个块之间没有代码,那么您可以进一步简化它,并删除
GOTO CHECKPASSACCT
行和
:CHECKPASSACCT
行。当您说它仍然不工作时,它给您带来了什么错误错误发生在第行吗?它不可能是同一个错误,因为有问题的
不再存在。此外,在
:COUNTER
块中,您可能希望将
%i%
置于双引号中,因为您可以在设置
i
之前输入该块。添加引号将解决该行中的语法错误,但您的逻辑仍然中断。变量
i
需要初始化设置为某个有效的起始值,以便在显式设置之前不会点击
:COUNTER
块。编辑批处理文件并在同一shell窗口中重新测试可能会导致在运行之间重复使用
i
等变量,因此请尝试在批处理文件顶部添加
set i=
等命令,以清除任何旧的数据ata在脚本执行之前(这可能会隐藏像这样的未初始化变量问题)。aws…它现在正在工作..看起来我缺少了“set i=”感谢bta帮助我…:)If更喜欢@pipitas anser而不是@bta,因为它更简单,不会回避
else
行为的问题。尽管这两个答案都很好。只是一个旁注,但我注意到在循环中调用
goto
的奇怪行为,在循环中它直接分支到
If
语句上方的一行。在这种情况下,奇怪的是,在ode>echo nul>nul
或目的地和
if
语句之间的类似语句。虽然有点晚,但描述是错误的。语法正确,如果“1”==“1”(goto:label1)使用
是绝对有效的,否则(goto:label2)
goto
不需要换行符错误,此处必须使用第一个括号块来构建命令块。没有括号,将无法解析ELSE(它将是
goto
命令的一部分),如果
false
条件而失败,

IF ==0 ( GOTO :RESETROUTER ) ELSE (