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

[文件操作] [已解决]批处理文件已存在则添加序号

[复制链接]
发表于 2023-7-20 11:28:55 | 显示全部楼层
回复 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 用的可能少一点,但像上面的代码,我有时候还是会用到的,以后得谨慎使用过大数字。
 楼主| 发表于 2023-7-20 11:33:42 | 显示全部楼层
回复 2# BingjianREMIX

非常感谢指导,接下来我根据自己水平稍微调整一下,因为个主要是针对TXT文件,我是要所有文件。
发表于 2023-7-20 14:22:17 | 显示全部楼层

如何尽快跳出 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技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-7-20 14:45:08 | 显示全部楼层
回复 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  
复制代码
 楼主| 发表于 2023-7-20 14:48:34 | 显示全部楼层
回复 5# 447219071


    感谢指导,学习了。
 楼主| 发表于 2023-7-20 14:49:47 | 显示全部楼层
回复 4# Batcher


    感谢大佬指点,小白努力学习中。
发表于 2023-7-20 14:51:25 | 显示全部楼层
回复 5# 447219071


    怎么有点像GPT的
发表于 2023-7-20 14:55:12 | 显示全部楼层
回复 17# adfs945


    没事把所有后缀改动一下就行,像*.*
发表于 2023-7-20 15:44:36 | 显示全部楼层
回复 19# adfs945


timeout %INTERVAL%
goto Again
你把这两行挪到第17行下面试试
发表于 2023-7-20 16:12:24 | 显示全部楼层
回复 18# aloha20200628


    是不是复制错了,为何一和二是4个0,三是5个0?
发表于 2023-7-20 16:24:31 | 显示全部楼层
回复 18# aloha20200628


   
谢谢老师指点!经过我粗略测试,发现三种方法,仍然没有避免for /l 产生不必要的迭代,细微的时间差别,可能是脚本自身的效率影响。
发表于 2023-7-20 16:34:15 | 显示全部楼层
回复 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技术 +1 收起 理由
Batcher + 1 乐于助人

查看全部评分

发表于 2023-7-20 17:21:39 | 显示全部楼层
回复 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"
复制代码
发表于 2023-7-20 17:54:03 | 显示全部楼层
回复 28# qixiaobin0715


   

谢谢大佬指点!大佬的代码更加直观易读。
发表于 2023-7-20 19:29:15 | 显示全部楼层

代码已作如下订正。看那些纯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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 17:08 , Processed in 0.020344 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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