[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理for命令的标签跳转、循环中断,if命令的并/或关系运算怎么实现?

批处理和其他脚本相比,有个很大的区别,就是批处理不是结构化编程语言。
实现很多算法时,绕很多弯路。

如题,for 命令的标签跳转、循环中断,if 命令的并/或关系运算怎么实现?
我们知道,for 命令中可以使用标签,但是,程序一旦运行到标签处,则不再进行之后的循环。
也就是不能执行continue ,而是执行了break.
鉴于此种情况,我只能采取不用for /L命令,而使用:loop goto loop来实现。
但是对于for /F,for /d ,far /r命令,我们又该怎么办?

对于if命令的关系表达式 并关系 可以用嵌套的办法来实现,或关系运算则可以写成多个if命令加goto 的方式例如:
  1. if %a%==1 ( goto a )
  2. if %b%==1 ( goto a )
  3. :a
  4. set /a"c+=1"
复制代码
但如果此时,if 语句在for 命令中,标签将致使for命令跳出循环。
如何解决这种矛盾????

批处理和其他脚本相比,有个很大的区别,就是批处理不是结构化编程语言。
::比尔盖兹也不是苹果的创始人……
实现很多算法时,绕很多弯路。

如题,for 命令的标签跳转、循环中断,if 命令的并/或关系运算怎么实现?
::用call,用if判断退出条件,用if嵌套、用两条if语句(if没有什么并关系,只有逻辑与)
我们知道,for 命令中可以使用标签,但是,程序一旦运行到标签处,则不再进行之后的循环。
也就是不能执行continue ,而是执行了break.
鉴于此种情况,我只能采取不用for /L命令,而使用:loop goto loop来实现。
但是对于for /F,for /d ,far /r命令,我们又该怎么办?
  1. 但如果此时,if 语句在for 命令中,标签将致使for命令跳出循环。
  2. 如何解决这种矛盾????
复制代码
用call代替goto

TOP

回复 2# Hello123World

call 代替 goto 后,标签在for 外面的话,不会跳出,但如果标签在for 内,同样跳出。
这时候,于是,%%i变量还得再次传递出来。真浪费效率。
不过,算了。
将就就好。

TOP

本帖最后由 CrLf 于 2011-8-18 20:16 编辑

for 命令的递归无法被打断,即使 goto 也必须等到递归完毕才执行跳转,而 call 虽然立刻从循环中跳到指定标签,但是出来混总得还的,调用结束后仍要回到 for 中继续循环。

if 没有与和或,但是可以构造一个:
  1. set /a a=12,b=34
  2. if %a%@%b%==12@34 echo 变量 a==12,且变量 b==34
复制代码
  1. if 017 equ 15 set equ=1
  2. if 16 equ 15 set equ=1
  3. if defined equ echo 017 或 16 等于 15
  4. ::或
复制代码
  1. if 017 equ 15 set /a equ+=1
  2. if 0xf equ 15 set /a equ+=1
  3. if !equ!==2 echo 017 与 0xf 均等于 15
  4. ::与
复制代码
用 set /a 实现或和与:
  1. set /a "test/=!!(017-15)+!!(0xf-15)" 2>nul||echo 017 与 0xf 均等于 15
  2. set /a "test/=!!(017-15)*!!(0xf-15)" 2>nul||echo 017 或 0xf 等于 15
复制代码
1

评分人数

    • 求知路漫漫: 使用了for,必须要完全循环完,即使满足条件 ...技术 + 1

TOP

返回列表