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

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

各位大佬大家好:

以下是小弟写的最简单的批处理命令:将AAA文件夹里面的内容剪切到BBB文件夹
move C:\Users\dmns25163\Desktop\AAA\*.* C:\Users\dmns25163\Desktop\BBB

当两个文件名相同的时候希望能有些区分,目前想到的届时增加尾缀。
例:新建 Microsoft Access 数据库→新建 Microsoft Access 数据库1→新建 Microsoft Access 数据库2(以此类推)

希望大神给与指导。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# adfs945


    之前已经有过类似的了,要善于搜索
  1. @echo off
  2. set /p yourprogramname=what your program name:
  3. :start
  4. cd /d "%~dp0"
  5. if not exist %yourprogramname%.txt (
  6.     set /a "fx=0"
  7. )
  8. if exist "%yourprogramname%.txt" (
  9.    set /a "fx=0"
  10.    set /a "b=1"
  11.    set /a "fx=%fx%+1"
  12.    set "OutFile=%yourprogramname%%fx%.txt"
  13. )
  14. if "%fx%" equ "0" (
  15.        set "OutFile=%yourprogramname%.txt"
  16. )
  17. :1
  18. (for /f "delims=" %%i in ('dir /b /a-d *.*') do (
  19.     if "%%i" neq "%OutFile%" (
  20.         echo,%%~ni
  21.     )
  22. ))>"%OutFile%"
  23. if exist "%yourprogramname%0 .txt" (
  24.    ren "%yourprogramname%0.txt" "%yourprogramname%1 .txt"
  25. )
  26. pause >nul
  27. goto start
复制代码
这个脚本会给出一个类似"文件名0.txt"的,如果不用的话就在进下一个循环的时候改掉"文件名1.txt"
QQ 1980286392

TOP

  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

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或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

回复 5# 447219071


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

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

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

TOP

回复 8# 77七


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

TOP

回复 9# qixiaobin0715


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

TOP

回复 10# WHY


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

TOP

回复 12# 77七


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

评分人数

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

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

回复 13# WHY

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

TOP

返回列表