回复 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- @echo off
- cd /d "D:\123"
- set "FileNum=11"
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
- echo Change name from "%%i" to "!FileNum!%%~xi"
- ren "%%i" "!FileNum!%%~xi"
- set /a FileNum+=1
- )
- 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- @echo off&setlocal enabledelayedexpansion
- rem 将文件存为ANSI编码 新文件名保存入list.txt
- set "ph=d:\123"
- REM 统计 list.txt 内文件数量并赋值 如果d:\123内已经存在文件退出
- for /f "delims=" %%i in (list.txt) do (
- if exist "!ph!\%%i" (
- set str=!ph! 已存在 %%i 文件
- goto :end
- )
- set /an+=1
- set "new_file_!n!=%%i"
- )
-
- REM 统计 d:\123 内文件数量并赋值
- for /f "delims=" %%i in ('dir /b /a-d "!ph!\*.pdf"') do (
- set /a m+=1
- set "file_!m!=%%i"
- )
-
- REM 比较文件数量 这里 list.txt 的文件数少于d:\123文件数 就退出
- if !m! gtr !n! set str=!ph! 的文件数量与 list.txt 不符&goto :end
- for /l %%i in (1,1,!n!) do ren "!ph!\!file_%%i!" "!new_file_%%i!"
- set str=共计完成 "!ph!" 文件夹的 !n! 个文件的重命名
- :end
- echo;!str!
- 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# 小白唐唐
依照文件日期时间升序的顺序,列出新文件名到文本,再对文件进行重命名
- @echo off
- rem 将list.txt和批处理文件存放在同目录下 "D:\123\" 即文件目录
- cd /d "D:\123\"
- setlocal enabledelayedexpansion
- set /a n=0
- for /f "delims=" %%i in ('dir /b /a-d /o:d') do (
- set /a n=n+1,m=0
- for /f "delims=" %%a in ('type "%~dp0list.txt"') do (
- set /a m=m+1
- if !n! equ !m! (
- echo ren "%%i" "%%a"
- ren "%%i" "%%a"
- )
- )
- )
- endlocal
- pause
复制代码
作者: 小白唐唐 时间: 2023-3-14 08:08
回复 38# 77七
七七大佬的程序也能运行,谢谢大佬。
作者: 小白唐唐 时间: 2023-3-14 08:11
回复 37# 小白唐唐
哪位大佬能教教我为什么会有这个bug
作者: 77七 时间: 2023-3-14 08:23
回复 40# 小白唐唐
我的代码也有问题吗?terse大佬的代码
- 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
- @echo off
- rem 匹配文件名包含扩展名 后7位,即后7位如包含在新名中就执行改名
- rem 注意 xxxxxx.xxx 的后7位 为 xxx.xxx
- rem 使用前先测试
- setlocal enabledelayedexpansion
- set n=7
- cd /d "D:\AAA\"
- for /f "delims=" %%i in ('dir /b /a-d ') do (
- set "str=%%~nxi"
- set "str=!str:~-%n%!"
- set m=
- for /f "delims=" %%a in ('type "%~f0" ^| find "!str!"') do (
- if not defined m (
- echo ren "%%i" "%%a"
- ren "%%i" "%%a"
- set m=1
- )
- )
- )
- endlocal
- pause
- exit
- :以下存放新名
- 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://bathome.net./) |
Powered by Discuz! 7.2 |