我正在尝试让这个批处理脚本工作,但我对某些命令有点问题。它不会将变量视为有效并将其发送到无效部分。奇怪的是,我在代码的另一部分中有相同的变量处理部分。这是我的代码:
: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部分。有什么建议吗?
答案 0 :(得分: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
个语句。
这一行也是如此:
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
行变得多余。
我还可以在你的脚本中发现另一个问题:如果comp
是一个空字符串,那么下面的比较(以及它的相似):
IF /I %comp%==1 goto reg
会评估这种非法表达:
IF /I ==1 goto reg
并将导致解释器引发错误。建议将固定字符连接到比较的两侧以避免这种情况,例如:
IF /I "%comp%"=="1" goto reg1
希望它有所帮助!