Board logo

标题: [其他] 【已结】同时赋多值,而分别执行的代码如何实现 [打印本页]

作者: 愚无尽    时间: 2009-2-22 18:44     标题: 【已结】同时赋多值,而分别执行的代码如何实现

@echo off
echo 1.x
echo 2.xx
echo 3.xxx
echo 4.xxxx
set /p n=请输入:
可以实现输入“123”后执行对应的123标签,而输入“124”执行下面124标签?
:x
:xx
:xxx
:xxxx

[ 本帖最后由 愚无尽 于 2009-2-23 13:21 编辑 ]
作者: namejm    时间: 2009-2-22 19:11

  演示代码如下:
  1. @echo off
  2. echo 1.x
  3. echo 2.xx
  4. echo 3.xxx
  5. echo 4.xxxx
  6. set /p n=请输入:
  7. goto %n%
  8. pause
  9. exit
  10. :x
  11. ……
  12. pause
  13. exit
  14. :xx
  15. ……
  16. pause
  17. exit
  18. :xxx
  19. ……
  20. pause
  21. exit
  22. :xxxx
  23. ……
  24. pause
  25. exit
复制代码
  需要注意的是,在每个标签段下,需要用正确的跳转语句或直接用exit退出语句,以防止批处理执行到其他标签段中的语句,因为批处理的执行顺序是“自上而下,逐条执行”的——在没有流程跳转语句的时候。

  另外,你的标题是说要同时赋多值而分别执行,难道是在输入的时候,同时输入 123 和 124,然后分别执行123标签段和124标签段吗?请注意标题和你的正文内容不要产生矛盾或歧义。
作者: 愚无尽    时间: 2009-2-22 19:32

多谢管理,不是那样的效果。
我需要的是执行前,输入了多个变量值,根据多个值再继续执行。不是分别输入,分别执行。
例如:n输入了12,那么就分别执行标签1,标签2
           n输入了134 ,那么就分别执行标签,1、3、4
应该清楚了吧,这个有点难表达

[ 本帖最后由 愚无尽 于 2009-2-22 19:33 编辑 ]
作者: 愚无尽    时间: 2009-2-22 19:38

@echo off
echo 1.x
echo 2.xx
echo 3.xxx
echo 4.xxxx
set /p n=请输入:
if n=12 就执行:x和:xx
if n=134 就执行 :x、:xxx、:xxxx
:x
:xx
:xxx
:xxxx

就是这种逻辑关系
作者: tireless    时间: 2009-2-22 20:04

  1. @echo off
  2. echo 1.x
  3. echo 2.xx
  4. echo 3.xxx
  5. echo 4.xxxx
  6. set /p n=请输入:
  7. call :%n:~,1%
  8. if "%n:~1,1%" neq "" call :%n:~1,1%
  9. if "%n:~2,1%" neq "" call :%n:~2,1%
  10. if "%n:~3,1%" neq "" call :%n:~3,1%
  11. pause
  12. exit
  13. :1 x
  14. echo 1.x
  15. goto :eof
  16. :2 xx
  17. echo 2.xx
  18. goto :eof
  19. :3 xxx
  20. echo 3.xxx
  21. goto :eof
  22. :4 xxxx
  23. echo 4.xxxx
  24. goto :eof
复制代码

[ 本帖最后由 tireless 于 2009-2-22 20:26 编辑 ]
作者: 愚无尽    时间: 2009-2-22 20:14     标题: 回复 5楼 的帖子

经测试有错误,谢谢,再看看
作者: tireless    时间: 2009-2-22 20:20     标题: 回复 6楼 的帖子

5楼已修改。忘记了给标签加冒号。。。
作者: 愚无尽    时间: 2009-2-22 20:25     标题: 回复 5楼 的帖子

非常感谢,有效,能不能简单分析一下。
作者: 愚无尽    时间: 2009-2-22 20:27

原帖由 tireless 于 2009-2-22 20:20 发表
5楼已修改。忘记了给标签加冒号。。。

晕,我也不细心没注意看,感谢。
if "%n:~1,1%" neq "" call :%n:~1,1%
if "%n:~2,1%" neq "" call :%n:~2,1%
if "%n:~3,1%" neq "" call :%n:~3,1%

假如输入的字符串太多,这里的内容会过多,代码不够精简,是否可以采用 for循环命令实现?
作者: 愚无尽    时间: 2009-2-22 20:31

对了,我的标签不是:1、:2、:3这样特定格式。
所以楼上的朋友,那个写法还是不能实现哈

[ 本帖最后由 愚无尽 于 2009-2-22 20:35 编辑 ]
作者: tireless    时间: 2009-2-22 20:46     标题: 回复 10楼 的帖子

建议使用跟输入相同的标签,反正标签后还可以加注释,不会降低代码可读性。
  1. @echo off
  2. echo 1.x
  3. echo 2.xx
  4. echo 3.xxx
  5. echo 4.xxxx
  6. set /p n=请输入:
  7. :lp
  8. call :%n:~,1%
  9. set n=%n:~1%
  10. if "%n%" neq "" goto lp
  11. pause
  12. exit
  13. :1 注释 x
  14. echo 1.x
  15. goto :eof
  16. :2 xx
  17. echo 2.xx
  18. goto :eof
  19. :3 xxx
  20. echo 3.xxx
  21. goto :eof
  22. :4 xxxx
  23. echo 4.xxxx
  24. goto :eof
复制代码

作者: 愚无尽    时间: 2009-2-22 20:51     标题: 回复 11楼 的帖子

标签数量远远超过了10个,所以应用起来不便。
作者: zjw767676    时间: 2009-2-22 21:24

  1. @echo off
  2. echo 1.x
  3. echo 2.xx
  4. echo 3.xxx
  5. echo 4.xxxx
  6. set n=
  7. set /p n=请输入你的选择(用空格分开):
  8. for %%i in (%n%) do goto %%i
  9. pause
  10. exit
  11. :1
  12. ……
  13. pause
  14. exit
  15. :2
  16. ……
  17. pause
  18. exit
  19. :3
  20. ……
  21. pause
  22. exit
  23. :4……
  24. pause
  25. exit
复制代码
输入不用空格分开也是可以的,代码就复杂了点
标签的代码不能有退出,应当允许同时执行所有标签!!!

[ 本帖最后由 zjw767676 于 2009-2-22 22:07 编辑 ]
作者: 愚无尽    时间: 2009-2-22 21:43     标题: 回复 13楼 的帖子

这个案例就是为了执行时候的便捷,假如还去输入空格分开的话,失去意义了
用一般的输入一个单次值,单独执行就行了
作者: zjw767676    时间: 2009-2-22 22:26     标题: 回复 14楼 的帖子

能说明下标签执行的是什么吗?
也许能给人点思路!
作者: 愚无尽    时间: 2009-2-22 22:43     标题: 回复 15楼 的帖子

执行的很多!比如:
if /i "%choice2%"=="A" goto optimize
if /i "%choice2%"=="B" goto Restore
if /i "%choice2%"=="C" goto ntfs
if /i "%choice2%"=="D" goto IE
if /i "%choice2%"=="E" goto virus
if /i "%choice2%"=="F" goto msdos
if /i "%choice2%"=="G" goto Drives
if /i "%choice2%"=="H" goto minfo
if /i "%choice2%"=="I" goto info
if /i "%choice2%"=="J" goto wmic
if /i "%choice2%"=="K" goto wd
if /i "%choice2%"=="L" goto bat
if /i "%choice2%"=="M" goto dy
if /i "%choice2%"=="N" goto set
if /i "%choice2%"=="O" goto ps
if /i "%choice2%"=="P" goto label
if /i "%choice2%"=="S" goto other
if /i "%choice2%"=="T" goto regsvr
if /i "%choice2%"=="U" goto mscon
if /i "%choice2%"=="V" goto 2000reg
if /i "%choice2%"=="W" goto 2000Restore
if /i "%choice2%"=="Q" goto killport
if /i "%choice2%"=="R" goto openport
if /i "%choice2%"=="Y" goto start
作者: batman    时间: 2009-2-22 23:24

按楼主的要求模拟一段代码:
  1. @echo off
  2. set /p choice=请选择项目(a b c):
  3. :lp
  4. if defined choice (
  5.   set "a=%choice:~,1%"&set "choice=%choice:~1%"
  6.   call,goto %%a%%
  7. )
  8. echo 所有项目都执行完毕&pause>nul&goto :eof
  9. :a
  10. echo 现在执行项目optimize
  11. ping /n 3 127.1>nul&goto lp
  12. :b
  13. echo 现在执行项目restore
  14. ping /n 3 127.1>nul&goto lp
  15. :c
  16. echo 现在执行项目ntfs
  17. ping /n 3 127.1>nul&goto lp
复制代码

作者: everest79    时间: 2009-2-22 23:32

  1. @Echo Off
  2. SetLocal ENABLEDELAYEDEXPANSION
  3. :menu
  4. Set String=l1,l2,l3,l4
  5. Set /P Input="Input:\>"
  6. For %%i in (%String%) Do (
  7.     Echo !Input!|Find /i "%%i" >nul&&Set Input=!Input:%%i=!&&Call :%%i
  8. )
  9. pause
  10. goto menu
  11. :l1
  12. echo %~0
  13. Goto :eof
  14. :l2
  15. echo %~0
  16. Goto :eof
  17. :l3
  18. echo %~0
  19. Goto :eof
  20. :l4
  21. echo %~0
  22. Goto :eof
复制代码

作者: 愚无尽    时间: 2009-2-22 23:53

原帖由 batman 于 2009-2-22 23:24 发表
按楼主的要求模拟一段代码:@echo off
set /p choice=请选择项目(a b c):
:lp
if defined choice (
  set "a=%choice:~,1%"&set "choice=%choice:~1%"
  call,goto %%a%%
)
echo 所有项目都执行完毕&pause>nu ...

非常感谢版主,热心的帮助,代码实现了需要的功能。
这个代码本身可以逐一输入,逐一执行的。那么是否可以同时输入,分别执行?化繁为简,提高效率嘛,于是有了这个代码的需求!
举个例子吧:假如你想叫一个人帮你买手机、相机、U盘。我想你不会叫他手机买了回来后,再叫他去帮你买相机吧,相机买了以后再叫他买U盘吧?现实不可能如此,但是批处理执行的时候好多情况如此!所以告诉他要买的东西列表,一起买回来即可啦!(汗死,什么例子嘛,这么别扭!@¥[email=#@%]#@%[/email],没法好多批就是这么做的。。。所以有了这个思考!)
作者: cjiabing    时间: 2009-2-23 00:09     标题: 完成任务

本来想用“%var:~0,1%”拆分提取输入字符的,但对这个不熟悉,请高手们指教。
弄来弄去还真的只是懂得FOR而已了,看来要加强学习。
  1. @echo off
  2. set /p var=请输入数字(有多个数字时用空格隔开):
  3. for %%i  in (%var%) do call  :%%i
  4. pause
  5. :1
  6. echo 偶看?
  7. goto :eof
  8. :2
  9. echo NND
  10. goto :eof
  11. :3
  12. echo ok!~
  13. goto :eof
复制代码

作者: Batcher    时间: 2009-2-23 09:38     标题: 回复 19楼 的帖子

如果有人帮你解决了问题,建议进行以下操作:

1、修改帖子标题,在标题最前面注明:【已结】

2、给竭尽所能帮你的人、正确回答问题的人加分(你自己的积分不会减少)以示感谢,虽然大家来论坛是为了学习而不是为了积分,但加分聊表谢意总是或多或少能够让花费了时间和精力无私帮助你的人略感欣慰。

3、如果你是在别人的提示下自己写出了代码,请把自己的方法贴出来跟大家分享一下,也许他人可以帮你指出代码中的不足之处、告诉你如何提高执行效率等,有交流才能更快地进步。





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