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

[文件操作] 请教老师们,批量改名的BAT如何实现?

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

回复 49# image1001


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

TOP

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

TOP

本帖最后由 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
复制代码
bat小白,请多指教!谢谢!

TOP

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

TOP

回复 45# image1001


   要怎么改呢?举个例子吧
bat小白,请多指教!谢谢!

TOP

回复 2# 77七


大佬,像这种john.txt改名用这个很好用,但是如果碰到1-john.txt,或者1-002-john.txt像这种,john在不同的位置的,要批量改名,这种有规律的在文件如何批量改名呢?

TOP

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

TOP

向高手们膜拜

TOP

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

TOP

回复 40# 小白唐唐


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


因为 !file_%%i! 这个变成空值了,所以把文件夹给重命名了
你试着把  !n!改成 !m! 试试,或者判断一下  !file_%%i!  这个是不是空值在重命名
不过你既然决定以这种方式重命名,命名之前可以看一下文本有多少行,文件有多少个,就不存在这些问题
bat小白,请多指教!谢谢!

TOP

回复 37# 小白唐唐


    哪位大佬能教教我为什么会有这个bug

TOP

回复 38# 77七


    七七大佬的程序也能运行,谢谢大佬。

TOP

回复 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
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 小白唐唐 于 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的照片都放在这里,供大佬看看

TOP

返回列表