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

回复 2# BingjianREMIX

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

TOP


如何尽快跳出 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

回复 3# 77七

非常感谢指导,测试OK。
另外我又追加了循环10秒运行一回,但是失败了,请继续指导一下。
  1. @echo off
  2. set INTERVAL=10
  3. :Again
  4. rem 批处理保存为ansi编码格式
  5. set "folder1=C:\Users\dmns25163\Desktop\AAA"
  6. set "folder2=C:\Users\dmns25163\Desktop\BBB"
  7. for %%a in ("%folder1%\*.*") do (
  8. if not exist "%folder2%\%%~nxa" (
  9. move "%%a" "%folder2%"
  10. ) else (
  11. call :1
  12. )
  13. )
  14. pause
  15. exit
  16. :1
  17. for /l %%l in (2,1,200) do (
  18. if not exist "%folder2%\%%~na(%%l)%%~xa" (
  19. move "%%a" "%folder2%\%%~na(%%l)%%~xa"
  20. exit /b
  21. )
  22. )
  23.    
  24.     del try.txt
  25.     timeout %INTERVAL%
  26.    
  27.     goto Again  
复制代码

TOP

回复 5# 447219071


    感谢指导,学习了。

TOP

回复 4# Batcher


    感谢大佬指点,小白努力学习中。

TOP

回复 5# 447219071


    怎么有点像GPT的
QQ 1980286392

TOP

回复 17# adfs945


    没事把所有后缀改动一下就行,像*.*
QQ 1980286392

TOP

回复 19# adfs945


timeout %INTERVAL%
goto Again
你把这两行挪到第17行下面试试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 18# aloha20200628


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

TOP

回复 18# aloha20200628


   
谢谢老师指点!经过我粗略测试,发现三种方法,仍然没有避免for /l 产生不必要的迭代,细微的时间差别,可能是脚本自身的效率影响。
bat小白,请多指教!谢谢!

TOP

回复 19# adfs945


   既然你需要如此频繁使用,将标签部分修改为 set /a +goto 好了,避免 for /l 影响效率,和for /l 数字固定问题。
  1. @echo off
  2. set INTERVAL=10
  3. :Again
  4. rem 批处理保存为ansi编码格式
  5. set "folder1=C:\Users\dmns25163\Desktop\AAA"
  6. set "folder2=C:\Users\dmns25163\Desktop\BBB"
  7. for %%a in ("%folder1%\*.*") do (
  8. if not exist "%folder2%\%%~nxa" (
  9. move "%%a" "%folder2%"
  10. ) else (
  11. set n=1
  12. call :1 "%%a"
  13. )
  14. )
  15. timeout %INTERVAL%
  16. goto Again
  17. pause
  18. exit
  19. :1
  20. set /a n+=1
  21. if not exist "%folder2%\%~n1(%n%)%~x1" (
  22. move "%~1" "%folder2%\%~n1(%n%)%~x1"
  23. exit /b
  24. ) else (
  25. goto :1
  26. )
复制代码
1

评分人数

bat小白,请多指教!谢谢!

TOP

回复 27# 77七
后面代码这样即可:
  1. :1
  2. set /a n+=1
  3. if exist "%folder2%\%~n1(%n%)%~x1" goto :1
  4. move "%~1" "%folder2%\%~n1(%n%)%~x1"
复制代码

TOP

回复 28# qixiaobin0715


   

谢谢大佬指点!大佬的代码更加直观易读。
bat小白,请多指教!谢谢!

TOP


代码已作如下订正。看那些纯P老玩家已经不深究 for/L 能否立即退出循环的问题了,切磋的只是如何“尽快”退出的“妙计高招”。for/L 的循环量一旦过万,钝感即现,上十万就相当吃力了... 好在批处理脚本勉为其难的企业级(大数量规模)应用,都有更高效的成熟解决方案,仅脚本而言,前有vbs/jscript/mshta/awk/...,后有powershell/python/... 着实省去了以往纯P非要在“螺蛳壳里作道场”的艰难曲折了...
  1. ::题型一》采用开关变量+if 语块包裹循环体 不用goto》耗时约2s
  2. set "#break="
  3. for /L %%n in (1,1,320000) do if not defined #break (set "n=%%n" &set #break=1)
  4. echo,%n%
  5. pause &exit/b
  6. ::题型二》采用 goto+if 语块包裹循环体》耗时1.6s
  7. for /L %%n in (1,1,320000) do if %%n equ 1 (set "n=%%n" &goto[outLoop])
  8. :[outLoop]
  9. echo,%n%
  10. pause &exit/b
  11. ::题型三》采用 goto,不采用 if 语块包裹循环体》耗时约1s
  12. for /L %%n in (1,1,320000) do (set "n=%%n" &goto[outLoop])
  13. :[outLoop]
  14. echo,%n%
  15. pause &exit/b
复制代码

TOP

返回列表