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

如何尽快跳出 for /L 循环》又是一个经典问题。
外网dostips.com就此曾有多次讨论,现简化出三个题型说明一些思路的对比结果,给本坛有兴趣者品味参考...
基本上是毙掉了在循环体内 call :xxx 子过程的方法,因其低效繁复。
个人感觉题型一类似 do-while 循环结构,也许更有实用价值。
  1. ::题型一,采用开关变量 + if 语块包裹循环体》耗时约2s
  2. @echo off
  3. set "#break="
  4. for /L %%n in (1,1,320000) do if not defined #break (
  5.    REM ”其他命令“
  6.    set "n=%%n" &set #break=1)
  7. echo,%n%
  8. ::exit/b
  9. ::题型二,采用 if 语块包裹循环体》约耗时1.5s
  10. @echo off
  11. for /L %%n in (1,1,320000) do if %%n equ 1 (
  12.     REM ”其他命令“
  13.     set "n=%%n" &goto[outLoop])
  14. :[outLoop]
  15. echo,%n%
  16. ::exit/b
  17. ::题型三,不采用 if 语块包裹循环体》耗时约12s
  18. @echo off
  19. for /L %%n in (1,1,3200000) do (
  20. REM ”其他命令“
  21. set "n=%%n" &goto[outLoop])
  22. :[outLoop]
  23. echo,%n%
  24. ::exit/b
复制代码
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 2# BingjianREMIX

非常感谢指导,接下来我根据自己水平稍微调整一下,因为个主要是针对TXT文件,我是要所有文件。

TOP

回复 14# qixiaobin0715

谢谢大佬指点!
  
  1. @echo off
  2. for /l %%l in (2,1,2000000) do (
  3. echo 1
  4. goto :2
  5. )
  6. :2
  7. echo 2
  8. pause
复制代码

像call for /l 用的可能少一点,但像上面的代码,我有时候还是会用到的,以后得谨慎使用过大数字。
bat小白,请多指教!谢谢!

TOP

回复 13# WHY

谢谢大佬指点!看来for /l 中使用 exit /b 或 goto 比较特殊,会增加不必要的迭代时间。
bat小白,请多指教!谢谢!

TOP

回复 11# 77七
应当和call关系不大,可能是与预处理有关,单独试试最后一段for循环:
  1. for /l %%l in (2,1,2000000) do (
  2. echo 1
  3. exit /b
  4. )
复制代码
同样会
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 12# 77七


    你可以这样理解:
遇到 exit,for /L 循环中的变量不会继续迭代,立马退出 cmd.exe
否则,for /L 循环中的变量会继续迭代,即使遇到 goto :EOF 或 exit/b 也是如此。
1

评分人数

    • 77七: 感谢分享技术 + 1

TOP

回复 10# WHY


      谢谢大佬指点!我不理解的是为什么执行8楼的脚本需要5秒?
bat小白,请多指教!谢谢!

TOP

回复 9# qixiaobin0715


   谢谢大佬指点!我的问题主要如8楼所示,我执行需要5秒,找不到原因。
bat小白,请多指教!谢谢!

TOP

回复 8# 77七


    把 exit /b 改成 exit 就能看出区别
在批处理脚本中,exit 是退出 cmd.exe,而 exit /b 与 goto :EOF 几乎等效,跳转到批处理结尾。

TOP

回复 7# 77七
call调用另一个批处理程序或自身程序段,调用完后,程序会回到原来的位置继续执行下去。

TOP

回复 4# Batcher


   站长,我把脚本简化了一下,方便测试
  1. @echo off
  2. echo %time%
  3. call :1
  4. echo %time%
  5. pause
  6. exit
  7. :1
  8. for /l %%l in (2,1,2000000) do (
  9. echo 1
  10. exit /b
  11. )
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2023-7-19 22:27 编辑

回复 4# Batcher


   

谢谢站长指点!不过我没明白,我使用exit /b 退出了,应该不会对,2-200全部遍历了吧?
  1. @echo off
  2. for /l %%l in (2,1,200) do (
  3.         >>123.txt echo 1
  4.         exit
  5. )
复制代码


比如把这个代码单独拿出来,文本也只会产生一个1。
  1. @echo off
  2. for /l %%l in (2,1,2000000) do (
  3.         >>123.txt echo 1
  4.         exit
  5. )
复制代码


像这样,脚本也是一闪而过就执行完毕,为什么用call之后要等很久?
bat小白,请多指教!谢谢!

TOP

回复 5# 447219071


    这代码是错的,你试试就知道了。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  1. @echo off  
  2. set source=C:\Users\dmns25163\Desktop\AAA  
  3. set destination=C:\Users\dmns25163\Desktop\BBB
  4. mkdir %destination%
  5. for /r "%source%" %%a in (*) do (  
  6.    set file=%%~nxa  
  7.    if exist "%destination%\%file%" (  
  8.        set /a i=1  
  9.        for %%b in ("%destination%\%~nxa") do (  
  10.            set /a i+=1  
  11.            ren "%destination%\%~nxa" "%destination%\%~nxa!i!"  
  12.        )  
  13.    ) else (  
  14.        move /y "%source%\%%a" "%destination%\%%a"  
  15.    )  
  16. )
复制代码
这段代码首先创建一个名为 BBB 的新文件夹(如果还不存在),然后进入 AAA 文件夹及其子文件夹。对于每个文件,它首先检查目标文件夹中是否已经存在同名的文件。如果存在,则在文件名后加上一个数字,以区分它们。如果没有,则将文件移动到目标文件夹。
请注意,这个批处理文件假设源文件夹(AAA)和目标文件夹(BBB)都在您的桌面上。如果您希望更改这些文件夹的路径,请更改 `set source` 和 `set destination` 行中的路径。

TOP

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表