Board logo

标题: [文件操作] 请教老师们,批量改名的BAT如何实现? [打印本页]

作者: image1001    时间: 2023-3-11 23:45     标题: 请教老师们,批量改名的BAT如何实现?

D盘AAA目录下有N个文件,如,原文件名为:john.txt ,TXT文本中整理好的新名称1-001-john.txt,新文件名是包含原文件名的,
新名称已经整理好TXT文本格式,如何通过BAT处理,使AAA目录下的所有文件自动改成txt文本中定义的新文件名?
或者这份新文件名不用单独的TXT存放新文件名,直接写到BAT中。
请老师们赐教,谢谢。
作者: 77七    时间: 2023-3-12 00:25

本帖最后由 77七 于 2023-3-12 00:40 编辑
  1. @echo off
  2. cd /d "D:\AAA\"
  3. for /f "delims=" %%i in ('dir /b /a-d ') do (
  4.         for /f "delims=" %%a in ('type "%~f0" ^| find "%%~nxi"') do (
  5.                 echo ren "%%i" "%%a"
  6.                 ren "%%i" "%%a"
  7.         )
  8. )
  9. pause
  10. exit
  11. :以下存放新名
  12. 1-001-john.txt
复制代码

作者: image1001    时间: 2023-3-12 01:44

运行完美,感谢老师
作者: Batcher    时间: 2023-3-12 09:09

回复 3# image1001


    如果新文件名都是在老文件名的基础上按照指定规律得来的,那么你不必手工准备那个新文件名列表,可以全部交给BAT代码一步到位。
作者: image1001    时间: 2023-3-12 12:05

是的,都是在老文件名上有规律的,直接用上面的代码将文件名写入BAT就完美解决了。
作者: 小白唐唐    时间: 2023-3-12 13:06

回复 2# 77七
大佬,如果不是txt文件该改什么地方呀
作者: 77七    时间: 2023-3-12 13:20

回复 6# 小白唐唐


    没有限制为txt文件,txt文件只是顶楼举的例子

除了文件夹外的任意带扩展名的文件都可以(不和代码冲突就好,比如一个文件没有扩展名 名为 "for" 就和代码冲突了)
作者: 小白唐唐    时间: 2023-3-12 14:45

回复 2# 77七

大佬,我试了下,怎么用不了
作者: 小白唐唐    时间: 2023-3-12 14:49

回复 8# 小白唐唐
    @echo off
cd /d "D:\123\"
for /f "delims=" %%i in ('dir /b /a-d /o:d') do (
        for /f "delims=" %%a in ('type "%~f0" ^| find "%%~nxi"') do (
                echo ren "%%i" "%%a"
                ren "%%i" "%%a"
        )
)
pause
exit:
121231.txt

我只添加了个时间顺序,感觉ren "%%i" "%%a"有点多余,但是就是运行不来
作者: 小白唐唐    时间: 2023-3-12 14:50

回复 9# 小白唐唐


    不是多余,是多了
作者: 小白唐唐    时间: 2023-3-12 14:53

回复 10# 小白唐唐


    但是只是我个人感觉
作者: terse    时间: 2023-3-12 15:03

回复 8# 小白唐唐
检查你的文件名中是否含有121231
还有你这样会有文件重复的可能
作者: 小白唐唐    时间: 2023-3-12 15:45

回复 12# terse


   没有的,我找了21个pdf文件试了试
作者: 小白唐唐    时间: 2023-3-12 15:49

回复 13# 小白唐唐


    @echo off
cd /d "D:\123\"
for /f "delims=" %%i in ('dir /b /a-d/o:d ') do (
        for /f "delims=" %%a in ('type "%~f0" ^| find "%%~nxi"') do (
                echo ren "%%i" "%%a"
                ren "%%i" "%%a"
        )
)
pause
exit

11.pdf
12.pdf
13.pdf
14.pdf
15.pdf
16.pdf
17.pdf
18.pdf
19.pdf
20.pdf
21.pdf
22.pdf
23.pdf
24.pdf
25.pdf
26.pdf
27.pdf
28.pdf
29.pdf
30.pdf
31.pdf
32.pdf
33.pdf
34.pdf
35.pdf
36.pdf
37.pdf
38.pdf
作者: 77七    时间: 2023-3-12 16:27

回复 14# 小白唐唐


   实际文件名呢?如果是单纯的测试验证代码,尽量保证新旧名称11对应吧,不要存在交叉、命名后重复什么的,看到你罗列的11.pdf 21.pdf ,两者只有 第一位数字是不同的,原来的文件名只能是11.p  21.pd之类的了,有点不符合实际。如果是实际需求,可以另开贴询问,感觉你和楼主的需求有点出入。
作者: Batcher    时间: 2023-3-12 16:48

回复 14# 小白唐唐


请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的,操作之后变成啥样?
如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: terse    时间: 2023-3-12 18:30

回复 14# 小白唐唐
源文件名 和BAT里准备的一样的话 会是这个结果啊
ren "11.pdf" "11.pdf"
ren "12.pdf" "12.pdf"
ren "13.pdf" "13.pdf"
...
作者: 小白唐唐    时间: 2023-3-12 19:22

回复 14# 小白唐唐
但是还是用不了
作者: 小白唐唐    时间: 2023-3-12 19:33

回复 16# Batcher


    大佬,我的想法是做一个bat文件,将txt或者xlsx文件的内容批量提取、对一个文件夹的文件进行批量修改
作者: 小白唐唐    时间: 2023-3-12 19:41

回复 19# 小白唐唐


    我看了网上的例子,先使用dir /b/a-d/o:d>>1.txt,得到1.txt这个文件,然后再用excel做出ren “原标题" "重命名标题“,再复制到另一个bat里,我就觉着是不是可以用一个bat文件,只要复制重命名标题进一个txt文件就可以自动重命名了
作者: 小白唐唐    时间: 2023-3-12 19:45

回复 20# 小白唐唐


    我的话,00后,学的土木(已毕业在工地),在大学的C语言C++也学的不怎么好,也不怎么用过论坛贴吧,所以不太会,望各位大佬包涵
作者: 小白唐唐    时间: 2023-3-12 19:46

回复 21# 小白唐唐


    工作才知道当初有机会不去学,不去争取,真的很笨
作者: Batcher    时间: 2023-3-12 21:30

回复 20# 小白唐唐


别听那些人瞎扯,他们不懂BAT。

请给一个真实的例子说明一下你的需求吧,比如操作之前是怎样的操作之后变成啥样
如果需要上传文件,可以用阿里云盘或百度网盘。

如果需要上传截图,可以找个图床,例如:
http://bbs.bathome.net/thread-60985-1-1.html
作者: 小白唐唐    时间: 2023-3-12 21:49

回复 23# Batcher


    我测试了这个例子,但是这个例子不能使用,之前我自己做了一些改动,不能运行,后面按照这个楼主的描述复刻了他的,也不能运行,所以不知道原因。复刻的只有文件后缀不同
作者: 小白唐唐    时间: 2023-3-12 21:53


这个是我自己的原文件,

这个是程序
结果就是原文件什么都没变,运行后是个黑框
作者: Batcher    时间: 2023-3-12 22:02

回复 25# 小白唐唐


我换个问法,你也暂时忘掉网上的Excel和这个帖子里面的所有代码。
能否告诉我,第一个图里面的原始的pdf文件重命名之后分别是什么名字?
作者: buyiyang    时间: 2023-3-12 22:07

回复 14# 小白唐唐


    你的需求和楼主是不同的,如果你只是想学习的话可以先看看论坛的bat教程区,那里的教程非常详尽,你会收获很多。
作者: 小白唐唐    时间: 2023-3-12 22:27

回复 27# buyiyang


    所以,我想先把这个比较接近的吃透
作者: 小白唐唐    时间: 2023-3-12 22:28

回复 26# Batcher


    11.pdf到24.pdf吗?
作者: 小白唐唐    时间: 2023-3-12 22:29

回复 27# buyiyang


    也谢谢指路,一个钟头只能发五条帖子,特意发一条来感谢各位
作者: Batcher    时间: 2023-3-12 22:44

回复 29# 小白唐唐


代码保存为 test.bat

请参考Q-04把bat文件保存为ANSI编码:
https://mp.weixin.qq.com/s/Koje4FufWxWBs7ioDy_LJA
  1. @echo off
  2. cd /d "D:\123"
  3. set "FileNum=11"
  4. setlocal enabledelayedexpansion
  5. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  6.     echo Change name from "%%i" to "!FileNum!%%~xi"
  7.     ren "%%i" "!FileNum!%%~xi"
  8.     set /a FileNum+=1
  9. )
  10. pause
复制代码

作者: 小白唐唐    时间: 2023-3-12 23:58

回复 31# Batcher


    是的,这样能输出结果,谢谢大佬,特别感谢,不过这只是各测试板块,我真正要得到的是用txt导入不规则的文件名,我看我能不能综合一下两位大佬的结果,自己做出我想要的东西
作者: Batcher    时间: 2023-3-13 09:13

回复 32# 小白唐唐


    祝好。如果搞不定,再回来说出内心深处的真实需求。
作者: terse    时间: 2023-3-13 12:34

假设要处理的文件夹是D:\123 PDF文件 新文件名存入LIST.TXT
  1. @echo off&setlocal enabledelayedexpansion
  2. rem 将文件存为ANSI编码  新文件名保存入list.txt
  3. set "ph=d:\123"
  4. REM 统计 list.txt 内文件数量并赋值 如果d:\123内已经存在文件退出
  5. for /f "delims=" %%i in (list.txt) do (
  6.      if exist "!ph!\%%i" (
  7.         set str=!ph! 已存在 %%i 文件
  8.         goto :end
  9.      )
  10.      set /an+=1
  11.      set "new_file_!n!=%%i"
  12. )
  13. REM 统计 d:\123 内文件数量并赋值
  14. for /f "delims=" %%i in ('dir /b /a-d "!ph!\*.pdf"') do (
  15.      set /a m+=1
  16.      set "file_!m!=%%i"
  17. )
  18. REM 比较文件数量 这里 list.txt 的文件数少于d:\123文件数 就退出
  19. if !m! gtr !n! set str=!ph! 的文件数量与 list.txt 不符&goto :end
  20. for /l %%i in (1,1,!n!) do ren "!ph!\!file_%%i!" "!new_file_%%i!"
  21. set str=共计完成 "!ph!" 文件夹的 !n! 个文件的重命名
  22. :end
  23. echo;!str!
  24. pause
复制代码

作者: 小白唐唐    时间: 2023-3-13 21:21

回复 34# terse
作者: 小白唐唐    时间: 2023-3-13 21:27

我靠,没想到大佬直接做出来了,昨天刚刚学到了rem显示注解,#不显示注解,delims定义间隔符,dir识别,rech回显,大佬直接解决了我的需求,谢谢大佬,工地上的工作很累,我也有很多东西要学习处理,我觉着这次是个机会,我也有兴趣,这将决定我有机会要么走出工地,要么迅速进步,谢谢各位大佬
作者: 小白唐唐    时间: 2023-3-14 00:45

本帖最后由 小白唐唐 于 2023-3-14 00:46 编辑

回复 34# terse


    首先还是感谢大佬,我在测试的时候也发现两个问题,现在也已经解决,也在这里给大佬汇报一下,因为文件也不只是pdf文件,所以我修改了,删去了/*.pdf的限制,并增加时间排序的效果
for /f "delims=" %%i in ('dir /b /a-d /o:d  "!ph!"') do (
     set /a m+=1
     set "file_!m!=%%i"
其次,我发现每次只有list.txt的文件名数目少于要修改的文件时才会触发不一致的警告,我发现时比对!n!和!m!用的是gtr,所以我改成了neq,完美解决
但是也还有个疑问,当list.txt文件名比要修改的多且使用gtr的时候,文件夹名也会被修改,感觉是个bug,但我一直不太清楚是数目原因导致的




这个bug的照片都放在这里,供大佬看看
作者: 77七    时间: 2023-3-14 03:15

回复 37# 小白唐唐


   依照文件日期时间升序的顺序,列出新文件名到文本,再对文件进行重命名
  1. @echo off
  2. rem 将list.txt和批处理文件存放在同目录下  "D:\123\" 即文件目录
  3. cd /d "D:\123\"
  4. setlocal enabledelayedexpansion
  5. set /a n=0
  6. for /f "delims=" %%i in ('dir /b /a-d /o:d') do (
  7. set /a n=n+1,m=0
  8. for /f "delims=" %%a in ('type "%~dp0list.txt"') do (
  9. set /a m=m+1
  10. if !n! equ !m! (
  11. echo ren "%%i" "%%a"
  12. ren "%%i" "%%a"
  13. )
  14. )
  15. )
  16. endlocal
  17. pause
复制代码

作者: 小白唐唐    时间: 2023-3-14 08:08

回复 38# 77七


    七七大佬的程序也能运行,谢谢大佬。
作者: 小白唐唐    时间: 2023-3-14 08:11

回复 37# 小白唐唐


    哪位大佬能教教我为什么会有这个bug
作者: 77七    时间: 2023-3-14 08:23

回复 40# 小白唐唐


   我的代码也有问题吗?terse大佬的代码
  1. for /l %%i in (1,1,!n!) do ren "!ph!\!file_%%i!" "!new_file_%%i!"
复制代码


因为 !file_%%i! 这个变成空值了,所以把文件夹给重命名了
你试着把  !n!改成 !m! 试试,或者判断一下  !file_%%i!  这个是不是空值在重命名
不过你既然决定以这种方式重命名,命名之前可以看一下文本有多少行,文件有多少个,就不存在这些问题
作者: 小白唐唐    时间: 2023-3-14 09:12

谢谢77大佬,把!n!改成!m!后,启动次数的统计跟文件数目一样了,能完美解决这个bug,我感觉应该和运算次数有关,当运算次数大于或者文件数目时候,比如12次运算次数,等到结果是f12不存在,系统可能不会往下运行,所以就返回空值,和大佬说的一样
作者: image1001    时间: 2023-3-14 14:44

向高手们膜拜
作者: terse    时间: 2023-3-14 14:48

回复 42# 小白唐唐
是的,疏忽了,开始确实用的neq判断不相等就退出,想到可能输入list不一定和实际文件数量相符,就用了GTR,
如果下面循环改N为M的话 应该也会有空值的出现
所以现在:
1,改判断那里可以gtr改为neq,两数不等就不去循环,
2,可先比较M和N, 然后选小的数进行循环;
2选1即可
作者: image1001    时间: 2023-3-18 17:27

回复 2# 77七


大佬,像这种john.txt改名用这个很好用,但是如果碰到1-john.txt,或者1-002-john.txt像这种,john在不同的位置的,要批量改名,这种有规律的在文件如何批量改名呢?
作者: 77七    时间: 2023-3-19 03:38

回复 45# image1001


   要怎么改呢?举个例子吧
作者: image1001    时间: 2023-3-19 19:16

比如,1-001-aaa.txt,1-002-bbb.txt,1-003-ccc.txt,有N个这样有规律的文件,批量改名为指定的新文件名,新文件名还是按原来的方法整理在BAT结尾处。
比如新文件名为:1-aaa.txt,2-bbb.txt,3-ccc.txt,也就是说,旧文件名去区配时,能指定从X个字符开始去匹配,符合条件的就改。
作者: 77七    时间: 2023-3-19 20:13

本帖最后由 77七 于 2023-3-19 20:20 编辑

回复 47# image1001


  1. @echo off
  2. rem 匹配文件名包含扩展名 后7位,即后7位如包含在新名中就执行改名
  3. rem 注意  xxxxxx.xxx  的后7位 为  xxx.xxx
  4. rem 使用前先测试
  5. setlocal enabledelayedexpansion
  6. set n=7
  7. cd /d "D:\AAA\"
  8. for /f "delims=" %%i in ('dir /b /a-d ') do (
  9.         set "str=%%~nxi"
  10.         set "str=!str:~-%n%!"
  11.         set m=
  12.         for /f "delims=" %%a in ('type "%~f0" ^| find "!str!"') do (
  13.                 if not defined m (
  14.                         echo ren "%%i" "%%a"
  15.                         ren "%%i" "%%a"
  16.                         set m=1
  17.                 )
  18.         )
  19. )
  20. endlocal
  21. pause
  22. exit
  23. :以下存放新名
  24. 1-001-john.txt
复制代码

作者: image1001    时间: 2023-3-19 21:29

现在举例的是AAA,BBB,CCC,这都是3位的,如果有的是3位,有的是4位,有的是5位呢?比如1-001-AAA.txt,1-002-BBBB.txt,1-003-cccc.txt,1-004-ddddd.txt这样的,他们的共同点就是左边都是固定的长度
作者: 77七    时间: 2023-3-19 21:51

回复 49# image1001


   http://www.bathome.net/thread-996-1-1.html
参考下这个教程, 修改第10行
例如
set a=!a:~0,n!
舍弃0位,保留n位




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2