
标题: [其他] [已解决] 批处理想在||前后执行分类,请问怎么做? [打印本页]
作者: zzz19760225 时间: 2025-2-11 20:23 标题: [已解决] 批处理想在||前后执行分类,请问怎么做?
本帖最后由 zzz19760225 于 2025-2-12 08:53 编辑
WIN764- @echo off
- :0
- set /p a=:
- goto:%a% ^|| goto:0
-
- :1
- echo:123
- goto:0
-
- :3
- echo:789
- goto:0
-
- :2
- echo:456
- goto:0
复制代码

实际并没有实现,前面出错,就执行后面的goto:0。
作者: aloha20200628 时间: 2025-2-11 20:55
本帖最后由 aloha20200628 于 2025-2-11 22:26 编辑
回复 1# zzz19760225
一楼代码中第四行 :%a% ^ 被系统视为非法标签名而报错,导致 goto 失效而续行下一行代码;批处代码中的 goto 是无条件转移,因此就逻辑而言,其后再接续其他命令并无意义...
以下是订正代码,可用直接回车键退出循环,但未予输入值合法性检查...- @echo off
- :0
- set "a=" &set /p "a=1/2/3:"
- if not defined a exit/b
- goto:%a%
- :1
- echo:123
- goto:0
- :3
- echo:789
- goto:0
- :2
- echo:456
- goto:0
复制代码
作者: hlzj88 时间: 2025-2-11 20:59
把你的第4行 分成两行,|| 不要了。
输入错误会找不到,就没有跳转,换行就是 goto 0
作者: aloha20200628 时间: 2025-2-11 21:33
本帖最后由 aloha20200628 于 2025-2-12 10:36 编辑
回复 1# zzz19760225
再给一个调用 choice 功能的版本,内置自动检查输入值合法性,输入值不必跟回车键...- @echo off
- :0
- choice /c 123q /m "q=退出"
- goto:%errorlevel%
- :4
- exit/b
- :1
- echo,123
- goto:0
- :2
- echo,456
- goto:0
- :3
- echo:789
- goto:0
复制代码
作者: zzz19760225 时间: 2025-2-12 07:04
本帖最后由 zzz19760225 于 2025-2-16 16:17 编辑
回复 zzz19760225
一楼代码中第四行 :%a% ^ 被系统视为非法标签名而报错,导致 goto 失效而续行下一行 ...
aloha20200628 发表于 2025-2-11 20:55 
谢谢回复
我用鼠标点击,运行闪了一下界面,跳出程序结束了。
然后用shift+鼠标右键点击=在此处打开命令行,
在命令行里执行如下
2楼

-
-
4楼

4楼在被吃掉的choice前面,加了一个空行让吃。(问题应该是复制代码到WIN7txt文本,会出现连成一线不分行的吃掉了)- @echo off
- :0
-
- choice /c 123q /m "q=退出"
- goto:%errorlevel%
- :4
- exit/b
-
- :1
- echo,123
- goto:0
-
- :2
- echo,456
- goto:0
-
- :3
- echo:789
- goto:0
复制代码

作者: zzz19760225 时间: 2025-2-12 07:14
回复 3# hlzj88
你好,我换成了两行,然后是鼠标点击可以执行,输入123之外,跳出。
于是命令行执行如下

作者: hlzj88 时间: 2025-2-12 07:48
- set /p a=
- if /i %a%==1 goto %a%
- if /i %a%==2 goto %a%
- if /i %a%==3 goto %a%
- goto 0
复制代码
作者: zzz19760225 时间: 2025-2-12 08:47
本帖最后由 zzz19760225 于 2025-2-14 11:46 编辑
回复 7# hlzj88
谢谢,这种形式可以完成了。- @echo off
- :0
- set /p a=:
- if /i %a%==1 goto %a%
- if /i %a%==2 goto %a%
- if /i %a%==3 goto %a%
- goto 0
-
- :1
- echo:123
- goto:0
-
- :3
- echo:789
- goto:0
-
- :2
- echo:456
- goto:0
复制代码

完成的形式- @echo off
- :0
- set /p a=:
- set b=1,2,3
- for %%i in (%b%) do (
- if /i %a%==%%i goto:%a%
- )
- echo:冇
- goto:0
-
- :1
- echo,123
- goto:0
-
- :2
- echo,456
- goto:0
-
- :3
- echo:789
- goto:0
复制代码

作者: aloha20200628 时间: 2025-2-12 10:23
本帖最后由 aloha20200628 于 2025-2-12 10:30 编辑
回复 5# zzz19760225
2楼代码已明确没有输入值合法性检查,楼主却用不存在的标签名 5 去尝试,当然会入坑了...
楼主用4楼代码时可见 cmd 命令行竟把 choice 吃掉一个首字符,结果就自爆了...
以下代码用来订正2楼代码,加入输入值合法性检查...- @echo off
- :0
- set "a=" &set /p "a=1/2/3:"
- if not defined a exit/b
- if "%a%" geq "1" if "%a%" leq "3" (set "ok=1") else goto:0
- goto:%a%
- :1
- echo:123
- goto:0
- :3
- echo:789
- goto:0
- :2
- echo:456
- goto:0
复制代码
作者: zzz19760225 时间: 2025-2-12 18:34
本帖最后由 zzz19760225 于 2025-2-12 18:55 编辑
回复 zzz19760225
2楼代码已明确没有输入值合法性检查,楼主却用不存在的标签名 5 去尝试,当然会入坑 ...
aloha20200628 发表于 2025-2-12 10:23 
是啊,没有那个变量却想去执行不存在的标签,和想要goto直接跳转无法||组合类似,简单的||是不行,需要各种侧面迂回尝试。
执行choice可以显示有输入文字提示,感谢。
没有你们的无私参与,是不好自我解决问题的,再次感谢。

很有意思的功能,怎么在最小值与最大值之间,就可以实现功能了。- @echo off
- :0
- set "a=" &set /p "a=1/2/3/4/5/6:"
- set b=1,2,3,4,5,6
- for %%i in (%b%) do (
- if not defined a exit/b
- if "%a%" geq "1" if "%a%" leq "6" (set "ok=1") else goto:0
- )
- goto:%a%
-
- :1
- echo:123
- goto:0
-
- :3
- echo:789
- goto:0
-
- :2
- echo:456
- goto:0
-
- :5
- echo:123000
- goto:0
-
- :4
- echo:789000
- goto:0
-
- :6
- echo:456000
- goto:0
复制代码

作者: 77七 时间: 2025-2-12 20:36
本帖最后由 77七 于 2025-2-12 21:02 编辑
复制代码
发现goto一个不存在的标签(标签必须合法,不引起闪退),会执行暂停,然后退出
- @echo off
- :0
- set /p a=:
- goto :%a% || %0
-
- :1
- echo:123
- goto:0
复制代码
这也是一种方法,但是首选还是先判断标签是否存在。
用call也行,不会退出
- @echo off
- :0
- set /p a=:
- call :%a%
- goto:0
-
- :1
- echo:123
- exit /b
复制代码
作者: zzz19760225 时间: 2025-2-13 09:25
在之前的已有数字和未有数字之外,又尝试键盘上其余按键看会不会跳出,发现两者都具有稳定度。- @echo off
- :0
- set /p a=:
- call :%a%
- goto:0
-
- :1
- echo:123
- goto:0
-
- :3
- echo:456
- goto:0
-
- :4
- echo:789
- exit /b
复制代码

欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |