Board logo

标题: [文本处理] 求助批处理if……goto…… 语句的用法 [打印本页]

作者: quartz123    时间: 2016-6-22 01:28     标题: 求助批处理if……goto…… 语句的用法

本帖最后由 pcl_test 于 2016-6-22 15:05 编辑

@echo off
    :xuanze
    set xz=
    set/p xz=是否继续[Y/N?]
    if "%xz%"=="Y" goto start
    goto end


如果不要goto end的话,输入Y回车则执行,现在输入Y回车直接不执行就退出了。。

PS:再请教下,在没有goto end的情况下,不用输入Y,直接回车也可以执行,那样的话    if "%xz%"=="Y" goto start 这句岂不是没作用了?

谢谢!
作者: hlzj88    时间: 2016-6-22 06:23

goto 是一种跳转和循环,在一个批处理中,可以跳转到批处理中的另一段语句,也可以在一段语句前后设置循环来重复运行。
每一个goto都需要一个地址或称之为标签,用来定位。如你上面的goto end,在整个批里没有另一个地址end来和他对应,因此不会成功。由于在你的goto后再没有了其他的语句,批处理退出。
  1. goto的循环
  2. :end
  3. 你的批处理命令
  4. goto end
复制代码
  1. goto跳转
  2. 你的命令
  3. goto end
  4. 你的其他命令
  5. :end
  6. ……
复制代码
可见,goto跳转,会脱离批处理语句的书写顺序,不执行“你的其他命令”而直接到后面的end处执行……
作者: q121212    时间: 2016-6-27 00:30

批处理是区分大小写的,一般对于字母,都会同时把大小写都导向标签
楼主看下是不是这个原因呢
作者: binghejin    时间: 2016-6-27 20:33

给你正确的写法。
  1. @echo off
  2. :xuanze
  3. set/p xz=是否继续?[Y/N]
  4. if %xz%==Y goto start
  5. if %xz%==N goto end
  6. :start
  7. 你的批处理
  8. goto end
  9. :end
复制代码
======批处理结束。写批处理的时候一定要完整,再有就是,上面的批处理有一个BUG,就是如果你输入的既不是Y,也不是N,或者直接回车,那么批处理依然会执行start标号之后的代码。原因是因为代码中没有考虑到使用者输入YN以外的字母时该怎么办,要避免这个BUG,可以按照如下代码修改。
  1. @echo off
  2. cls
  3. :xuanze
  4. set/p xz=是否继续?[Y/N]
  5. if %xz%==Y goto start
  6. if %xz%==N goto end
  7. goto xuanze
  8. :start
  9. 你的批处理
  10. goto end
  11. :end
复制代码





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