3

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

: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 部分。有什么建议么?

4

1 回答 1

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


希望能帮助到你!

于 2012-12-16T15:10:30.433 回答