[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
  1. @echo off
  2. rem 批处理保存为ansi编码格式
  3. set "folder1=C:\Users\dmns25163\Desktop\AAA"
  4. set "folder2=C:\Users\dmns25163\Desktop\BBB"
  5. for %%a in ("%folder1%\*.*") do (
  6. if not exist "%folder2%\%%~nxa" (
  7. move "%%a" "%folder2%"
  8. ) else (
  9. call :1
  10. )
  11. )
  12. pause
  13. exit
  14. :1
  15. for /l %%l in (2,1,200) do (
  16. if not exist "%folder2%\%%~na(%%l)%%~xa" (
  17. move "%%a" "%folder2%\%%~na(%%l)%%~xa"
  18. exit /b
  19. )
  20. )
复制代码

我在写脚本中,发现一个问题。在此请教一下路过的老师、大佬,为什么我把200改为2000000,移动完一个文件后会等待很久才继续移动下一个?echo %%l观察了一下,并没有在循环中,但是实际还是在执行for /l 的循环,数字越大等待越久。
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

回复 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

回复 9# qixiaobin0715


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

TOP

回复 10# WHY


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

TOP

回复 13# WHY

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

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

回复 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

回复 28# qixiaobin0715


   

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

TOP

回复 30# aloha20200628


   

谢谢老师指点!您的意思我大概理解了,既然无法立即退出for /l 循环,就提高批处理代码效率,使for /l 尽快退出。
bat小白,请多指教!谢谢!

TOP

返回列表