繁体   English   中英

可变批处理循环问题

[英]Variable batch loop issue

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

: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

问题出在这一行:

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放在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


希望能帮助到你!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM