可变批处理循环问题

时间:2012-12-16 04:00:18

标签: variables batch-file set ping goto

我正在尝试让这个批处理脚本工作,但我对某些命令有点问题。它不会将变量视为有效并将其发送到无效部分。奇怪的是,我在代码的另一部分中有相同的变量处理部分。这是我的代码:

:comp
cls
ECHO.
ECHO =================================================
ECHO Please Select the Device you would like to ping:
ECHO =================================================
SET /P comp="> "
IF /I %comp%==1 goto reg
IF /I %comp%==2 goto reg2
IF /I %comp%==3 goto reg3
IF /I %comp%==4 goto reg4
IF /I %comp%==5 goto reg5
IF /I %comp%==6 goto reg6
IF /I %comp%==7 goto reg7
IF /I %comp%==8 goto reg8
IF /I %comp%==9 goto reg9
IF /I %comp%==0 goto reg0
IF NOT %comp%=='1''2''3''4''5''6''7''8''9''0' goto inval
goto _ping
:inval
cls
ECHO.
ECHO ======================================
ECHO Choice invalid, please try again.
ECHO ======================================
ECHO.
pause
goto comp
:reg
cls
ECHO.
ECHO =========================================================
ECHO Please select the specific you would like to connect to.
ECHO =========================================================
ECHO.
SET /P regi="> "
IF /I %regi%==1 set str3=141
IF /I %regi%==2 set str3=142
IF /I %regi%==3 set str3=143
IF /I %regi%==4 set str3=144
IF /I %regi%==5 set str3=145
IF /I %regi%==6 set str3=146
IF /I %regi%==7 set str3=147
IF /I %regi%==8 set str3=148
IF /I %regi%==9 set str3=149
IF NOT %regi%=='1''2''3''4''5''6''7''8''9''0' goto inval
goto _ping

所以第一部分工作并发送到右边部分。第二部分是无效响应部分,第三部分是处理确切设备(和最后一个八位字节)ping的部分。如果您输入有效选项,它仍然会转到if not并处理到inval部分。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

问题#1

问题出在这一行:

IF NOT %regi%=='1''2''3''4''5''6''7''8''9''0' goto inval

由于regi不等于字符串'1''2''3''4''5''6''7''8''9''0'(给定合法的0-9输入),脚本将始终跳转到inval部分。请注意,这一行背后的逻辑是有缺陷的:用户不太可能输入这个作为输入,我怀疑你是否想要这种行为。

相反,我认为您只想检查regi是否为数字。对此的解决方案是将str3初始化为某个初始值,并在if语句之后进行检查:

str3=invalid
IF /I "%regi%"=="1" set str3=141
...
IF /I "%regi%"=="9" set str3=149
IF "%str3%"=="invalid" goto inval
goto _ping

如果str3保留“无效”值,则表示输入无效,因为没有执行if个语句。

问题#2

这一行也是如此:

IF NOT %comp%=='1''2''3''4''5''6''7''8''9''0' goto inval

这会将comp检查为非常不可能的

如果执行了任何if语句,脚本将跳转到其中一个“reg”标签。如果输入无效,则会跳过if语句,因此只需将goto inval放在它们之后,如下所示:

IF /I "%comp%"=="1" goto reg
...
IF /I "%comp%"=="0" goto reg0
goto inval

这也使以下goto ping行变得多余。

问题#3

我还可以在你的脚本中发现另一个问题:如果comp是一个空字符串,那么下面的比较(以及它的相似):

    IF /I %comp%==1 goto reg

会评估这种非法表达:

IF /I ==1 goto reg

并将导致解释器引发错误。建议将固定字符连接到比较的两侧以避免这种情况,例如:

IF /I "%comp%"=="1" goto reg1


希望它有所帮助!