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

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

[复制链接]
发表于 2023-7-19 14:29:38 | 显示全部楼层 |阅读模式
各位大佬大家好:

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

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

希望大神给与指导。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-7-19 16:11:11 | 显示全部楼层
回复 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"
发表于 2023-7-19 17:38:41 | 显示全部楼层
  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 的循环,数字越大等待越久。
发表于 2023-7-19 21:34:45 | 显示全部楼层
发表于 2023-7-19 21:38:21 | 显示全部楼层
  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` 行中的路径。
发表于 2023-7-19 22:00:01 | 显示全部楼层
回复 5# 447219071


    这代码是错的,你试试就知道了。
发表于 2023-7-19 22:10:50 | 显示全部楼层
本帖最后由 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之后要等很久?
发表于 2023-7-19 22:34:32 | 显示全部楼层
回复 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.         )
复制代码
发表于 2023-7-20 10:03:07 | 显示全部楼层
回复 7# 77七
call调用另一个批处理程序或自身程序段,调用完后,程序会回到原来的位置继续执行下去。
发表于 2023-7-20 10:22:06 | 显示全部楼层
回复 8# 77七


    把 exit /b 改成 exit 就能看出区别
在批处理脚本中,exit 是退出 cmd.exe,而 exit /b 与 goto :EOF 几乎等效,跳转到批处理结尾。
发表于 2023-7-20 10:35:58 | 显示全部楼层
回复 9# qixiaobin0715


   谢谢大佬指点!我的问题主要如8楼所示,我执行需要5秒,找不到原因。
发表于 2023-7-20 10:39:47 | 显示全部楼层
回复 10# WHY


      谢谢大佬指点!我不理解的是为什么执行8楼的脚本需要5秒?
发表于 2023-7-20 10:47:48 | 显示全部楼层
回复 12# 77七


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

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2023-7-20 10:49:54 | 显示全部楼层
回复 11# 77七
应当和call关系不大,可能是与预处理有关,单独试试最后一段for循环:
  1.         for /l %%l in (2,1,2000000) do (
  2.                 echo 1
  3.                 exit /b
  4.         )
复制代码
同样会

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

发表于 2023-7-20 11:24:39 | 显示全部楼层
回复 13# WHY

谢谢大佬指点!看来for /l 中使用 exit /b 或 goto 比较特殊,会增加不必要的迭代时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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