无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 292|回复: 18
打印 上一主题 下一主题

[分享] 批处理循环中实现break和continue

  [复制链接]
跳转到指定楼层
1#
发表于 昨天 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hlowld 于 2026-2-12 10:03 编辑

在不启用变量延迟扩展且不使用goto的前提下,循环块内变量不会实时更新,无法用作是否执行循环代码的判断,改用verify设置errorlevel,用 if errorlevel或if not errorlevel来判断是否执行循环代码。示例代码如下:

@echo off
echo 模拟continue,触发时跳过本次继续循环
for /l %%i in (1, 1, 5) do (
        verify >nul 2>nul
        if %%i equ 3 (verify bad >nul 2>nul & echo 触发continue,跳过本次继续循环)
        if not errorlevel 1 (
                rem 循环代码
                echo 执行 %%i
        )
)
echo 模拟break,触发时终止循环
verify >nul 2>nul
for /l %%i in (1, 1, 5) do (
        if %%i equ 3 (verify bad >nul 2>nul & echo 触发break,终止循环)
        if not errorlevel 1 (
                rem 循环代码
                echo 执行 %%i
        )
)
pause
exit



点评

批处理编程重大突破  发表于 昨天 10:39

评分

参与人数 2无忧币 +10 收起 理由
zbaby523 + 5 赞一个!
chiannet + 5 精妙!

查看全部评分

2#
发表于 昨天 09:43 | 只看该作者
不明觉厉
回复

使用道具 举报

3#
发表于 昨天 09:43 | 只看该作者
批处理还是复杂了。感觉换成python把,
回复

使用道具 举报

4#
发表于 昨天 09:54 | 只看该作者
了解
回复

使用道具 举报

5#
发表于 昨天 09:56 | 只看该作者
感谢分享!
回复

使用道具 举报

6#
发表于 昨天 10:05 | 只看该作者
不错。。。。。。。。。。。
回复

使用道具 举报

7#
发表于 昨天 10:18 | 只看该作者
感谢分享!
回复

使用道具 举报

8#
发表于 昨天 10:19 | 只看该作者
支持原创
回复

使用道具 举报

9#
发表于 昨天 10:22 | 只看该作者
感谢分享!除了verify,不知其他命令是否可行?
回复

使用道具 举报

10#
发表于 昨天 10:56 | 只看该作者
谢谢分享,学批处理7年有余,我小白还不会写批处理,仰慕大神
回复

使用道具 举报

11#
发表于 昨天 11:45 | 只看该作者
谢谢分享!
回复

使用道具 举报

12#
发表于 昨天 11:49 | 只看该作者
感谢分享
回复

使用道具 举报

13#
发表于 昨天 11:49 | 只看该作者
又学习到了
回复

使用道具 举报

14#
发表于 昨天 16:11 | 只看该作者
多谢分享!!!
回复

使用道具 举报

15#
发表于 昨天 19:19 | 只看该作者
本帖最后由 redyear2026 于 2026-2-12 22:19 编辑

批处理脚本的 for 语块能否实现真正的 break,迄今只有采用 goto 方法被实测真正有效(且只能一次性跳出所有外包循环体),一楼的示例只是一个假象,可用以下代码验证

  1. @echo off
  2. for /l %%i in (1, 1, 5) do (
  3.     if %%i equ 3 (verify bad >nul 2>nul & echo,尝试触发break,终止循环)
  4.     if not errorlevel 1 (echo,执行 %%i)
  5.     echo,验证每次循环序号=%%i
  6. )
  7. pause&exit/b
复制代码

用 goto 方法实现真正的 break,见如下示例代码
  1. @echo off
  2. for /l %%i in (1, 1, 5) do (
  3.     if %%i equ 3 (set "l=%%i" &goto :b)
  4.    echo,验证每次循环序号=%%i
  5. )
  6. :b
  7.    echo,%l%
  8. pause&exit/b
复制代码

至于在 for 语块中实现 continue,有更简单的方法可见如下代码

  1. @echo off
  2. for /l %%i in (1, 1, 5) do if %%i neq 3 (
  3.     rem 循环代码
  4.     echo,执行 %%i
  5. )
  6. pause&exit/b
复制代码

点评

代码块里,即()包裹的代码里,用goto语句,将会立即终止代码块的执行。  详情 回复 发表于 昨天 21:59
回复

使用道具 举报

16#
发表于 昨天 21:59 | 只看该作者
redyear2026 发表于 2026-2-12 19:19
批处理脚本的 for 语块能否实现真正的 break,迄今只有采用 goto 方法被实测真正有效(且只能一次性跳出所 ...

代码块里,即()包裹的代码里,用goto语句,将会立即终止代码块的执行。
回复

使用道具 举报

17#
发表于 昨天 23:22 | 只看该作者
本帖最后由 guimei5320 于 2026-2-12 23:24 编辑

这个主要核心就是命令执行的返回值。
楼主的代码,应该是能实现的。
因为没有重置errorlevel为0,所以就不执行循环体了。一定要看清verify命令的位置。
其他命令也可以实现,主要是需要确定errorlevel的返回值。
回复

使用道具 举报

18#
发表于 昨天 23:49 | 只看该作者
学习一下
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2026-2-13 03:35

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表