标题: [文件操作] 批处理如何修改带特点符号文件名? [打印本页]
作者: jcrh_bf 时间: 2022-8-25 22:04 标题: 批处理如何修改带特点符号文件名?
想修改特定文件夹下,特定文件名称,如:
E:盘里面文件 5862#332.pdf 需要把#和后面数字去掉重命名为 5862.pdf
建立如下批处理命令,出现个问题,第一次运行后能正常命名,但是如果后面重复命名后,就会不停的在后面加.pdf运行一次加一次变成5862.pdf.pdf.pdf
请问下如下命令怎么改下,如果文件名称中没有#这个符号就不从新命名- cd /d E:\8.25
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
- for /f "tokens=1 delims=-#" %%a in ("%%i") do (
- ren "%%i" "%%a "
- )
- )
复制代码
作者: fzp070 时间: 2022-8-25 22:25
将重命名后的文件移到其它路径,比如在当前文件夹内再建个文件夹放置。
作者: idwma 时间: 2022-8-25 22:59
复制代码
作者: jcrh_bf 时间: 2022-8-25 23:08
将重命名后的文件移到其它路径,比如在当前文件夹内再建个文件夹放置。
fzp070 发表于 2022-8-25 22:25
不会批处理命令,请问下,改名移动到另外指定文件夹,怎么改加一段什么命令比如,移动到E】E:\test 文件夹下
作者: jcrh_bf 时间: 2022-8-25 23:09
本帖最后由 jcrh_bf 于 2022-8-25 23:20 编辑
回复 3# idwma
cd /d E:\8.25
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *?#?*.pdf') do (
for /f "tokens=1 delims=-#" %%a in ("%%i") do (
ren "%%i" "%%a "
)
)
替换后文件后缀名也取消了,.pdf没有了
cd /d E:\8.25
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *?#?*.pdf') do (
for /f "tokens=1 delims=-#" %%a in ("%%i") do (
ren "%%i" "%%a%%~xi"
)
)
ren 后面加了个%%~xi 可以了,谢谢
作者: fzp070 时间: 2022-8-25 23:33
回复 4# jcrh_bf
看你5楼,是好了是吧。
移动就是在ren下加 move "%%a" E:\test
我刚试你的代码,发现在我电脑上运行(Win11),后缀.pdf也没了,所以我改成这样在我电脑上运行也可以- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
- for /f "tokens=1 delims=-#" %%a in ("%%i") do (
- ren "%%i" "%%a.tmp"
- )
- )
- ren *.tmp *.pdf
- pause
复制代码
作者: jcrh_bf 时间: 2022-8-25 23:41
回复 6# fzp070
谢谢上面的问题好了,又遇到个问题,如果有改名后有相同文件名的文件他就不自动命名了
能不能把 相同文件名替换掉或者 如果有相同文件名后面加~1 ~2 ~3 这种
作者: fzp070 时间: 2022-8-25 23:57
回复 7# jcrh_bf
在6楼代码上改的,你自己将set n之类的换到你要的代码中去- setlocal enabledelayedexpansion
- set n=0
- for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
- set /a n+=1
- for /f "tokens=1 delims=-#" %%a in ("%%i") do (
- ren "%%i" "%%a!n!.tmp"
- )
- )
- ren *.tmp *.pdf
- pause
复制代码
作者: hfxiang 时间: 2022-8-26 08:42
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /a-d *.pdf^|find "#"') do (
- for /f "tokens=1 delims=#" %%b in ("%%a") do (
- if exist "%%~b.pdf" (
- set /a n=1
- call :No_DupFile "%%~b"
- ren "%%~a" "%%~b~!n!.pdf"
- ) else (
- ren "%%~a" "%%~b.pdf"
- )
- )
- )
- endlocal
- exit/b
- :No_DupFile
- if exist "%~1~!n!.pdf" (
- set /a n+=1
- goto :No_DupFile
- )
复制代码
作者: qixiaobin0715 时间: 2022-8-26 08:56
本帖最后由 qixiaobin0715 于 2022-8-26 16:43 编辑
回复 7# jcrh_bf
一个不是太精确的代码:
重名文件必须严格按照楼主提供的规则命名,即顺序号是~1、~2、~3...等(包括已有的,已经命名过的重名文件)构成,中间不能有断档(比如存在~1,~3,而没有~2)
代码保存为ANSI编码:- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=1* delims=#" %%i in ('dir /b /a-d *#*.pdf') do (
- if not exist "%%i.pdf" (
- ren "%%i#%%j" "%%i.pdf"
- ) else (
- set n=1
- for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1
- ren "%%i#%%j" "%%i~!n!.pdf"
- )
- )
- pause
复制代码
注意代码未经测试。
作者: hfxiang 时间: 2022-8-26 09:28
回复 10# qixiaobin0715
高手!!!学习的标杆!!!
纯探讨一下,如果把第7、8两行合并如下:- for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|find /c ".pdf"') do set /a n=%%k+1
复制代码
是不是对于俺这样的新手来说更容易理解一点
作者: hfxiang 时间: 2022-8-26 09:34
回复 10# qixiaobin0715
哦,抱歉,没注意 findstr /ber 使用正则表达式的严格探索,班门弄斧了
作者: qixiaobin0715 时间: 2022-8-26 10:01
回复 11# hfxiang
主要是防止出现类似这样的文件名:
abc#jh.pdf
abc~mn.pdf
作者: qixiaobin0715 时间: 2022-8-26 10:17
回复 11# hfxiang
退一步来说,即使没有特殊情况,也是需要的,第一个重名文件命名也是需要n值的。你那样,n=1就永远取不到。
作者: jcrh_bf 时间: 2022-8-26 15:59
回复 8# fzp070
setlocal enabledelayedexpansion
set n=0
for /f "delims=" %%i in ('dir /b /a-d *?#?*.pdf') do (
set /a n+=1
for /f "tokens=1 delims=-#" %%a in ("%%i") do (
ren "%%i" "%%a(!n!)%%~xi"
)
)
pause
第一个文件重复可以,但是第二个文件再有重复就提示有重名文件
存在一个重名文件,或是找不到文件。
就是说只能用一次 +1 后面没法继续 2 3 4
作者: jcrh_bf 时间: 2022-8-26 16:03
本帖最后由 jcrh_bf 于 2022-8-26 16:25 编辑
回复 9# hfxiang
这个没问题哈,谢谢热心解答
能不能看看,如果改名后有重名文件,能不能删除重名文件 再改名
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *?#?*.pdf') do (
for /f "tokens=1 delims=-#" %%a in ("%%i") do (
ren "%%i" "%%a%%~xi"
)
)
作者: jcrh_bf 时间: 2022-8-26 16:05
本帖最后由 jcrh_bf 于 2022-8-26 16:14 编辑
回复 10# qixiaobin0715
你好,这个运行后提示
系统找不到指定的文件。
能不能看看,如果改名后有重名文件,能不能删除重名文件再改名
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *?#?*.pdf') do (
for /f "tokens=1 delims=-#" %%a in ("%%i") do (
ren "%%i" "%%a%%~xi"
)
)
作者: qixiaobin0715 时间: 2022-8-26 16:44
回复 17# jcrh_bf
已修改,再试试。
作者: hfxiang 时间: 2022-8-26 16:48
回复 16# jcrh_bf - @echo off
- for /f "delims=" %%i in ('dir /b /a-d *?#?*.pdf') do (
- for /f "tokens=1 delims=-#" %%a in ("%%i") do (
- move "%%i" "%%a%%~xi"
- )
- )
复制代码
作者: jcrh_bf 时间: 2022-8-26 17:14
本帖最后由 jcrh_bf 于 2022-8-26 17:30 编辑
回复 19# hfxiang
把这个批处理和需要处理的文件放一个文件夹下,能正常命名,但是加入一个定位文件夹这个命令怎么就无效了
文件名、目录名或卷标语法不正确。 提示的语法不正确,是不是定位那个输入错了
@echo off
cd/d E:\8.26\已处理
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('dir /b /a-d *.pdf^|find "#"') do (
for /f "tokens=1 delims=#" %%b in ("%%a") do (
if exist "%%~b.pdf" (
set /a n=1
call :No_DupFile "%%~b"
ren "%%~a" "%%~b~!n!.pdf"
) else (
ren "%%~a" "%%~b.pdf"
)
)
)
endlocal
exit/b
:No_DupFile
if exist "%~1~!n!.pdf" (
set /a n+=1
goto :No_DupFile
)
pause
放在文件夹外,点击批处理命令没有反应
作者: jcrh_bf 时间: 2022-8-26 17:30
回复 18# qixiaobin0715
可以了哈,谢谢
作者: fzp070 时间: 2022-8-26 18:00
回复 15# jcrh_bf
呃,在我这不能复现你的问题,我用15楼代码,一句没改,可以自动在后面添加(1)(2)(3)...
作者: jcrh_bf 时间: 2022-8-26 18:12
回复 22# fzp070
怪事,我这后面的提示找不到文件
E:\8.26\已处理>setlocal enabledelayedexpansion
E:\8.26\已处理>set n=0
E:\8.26\已处理>for /F "delims=" %i in ('dir /b /a-d *?#?*.pdf') do (
set /a n+=1
for /F "tokens=1 delims=-#" %a in ("%i") do (ren "%i" "%a(!n!)%~xi" )
)
E:\8.26\已处理>(
set /a n+=1
for /F "tokens=1 delims=-#" %a in ("1055#222.pdf") do (ren "1055#222.pdf" "%a(!n!).pdf" )
)
E:\8.26\已处理>(ren "1055#222.pdf" "1055(!n!).pdf" )
存在一个重名文件,或是找不到文件。
E:\8.26\已处理>pause
请按任意键继续. . .
终止批处理操作吗(Y/N)?
作者: fzp070 时间: 2022-8-26 18:15
回复 23# jcrh_bf
是啊,你15楼的代码在我这运行没有问题,见附件动图。。。能不能说下你的几个pdf文件名,我看下是不是名称差异导致
https://wwp.lanzouv.com/ioJRg0ablmje
作者: hfxiang 时间: 2022-8-26 19:05
回复 20# jcrh_bf
前3行的次序调整一下:- @echo off
- setlocal enabledelayedexpansion
- cd /d E:\8.26\已处理
复制代码
即可
作者: hfxiang 时间: 2022-8-26 19:10
回复 20# jcrh_bf
或者你检查一下,是否已保存为ANSI编码格式
作者: qixiaobin0715 时间: 2022-8-27 11:22
回复 17# jcrh_bf
直接替换就简单多了:- for /f "tokens=1* delims=#" %%i in ('dir /b /a-d *#*.pdf') do copy /y "%%i#%%j" "%%i.pdf"
复制代码
作者: jcrh_bf 时间: 2022-8-27 19:16
回复 10# qixiaobin0715
你好帮看看,把你这个代码套到剪切移动 如有重名文件+ ~1 ~2 ~3 怎么没有反应,帮看看那步有问题,谢谢
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
for /f "delims=" %%i in ("%%i") do (
if not exist "%%i.pdf" (
move "%%i" E:\2022年\8月\27日\"%%i"
) else (
set n=1
for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1
move "%%i#%%j" E:\2022年\8月\27日\"%%i~!n!.pdf"
)
))
pause
作者: qixiaobin0715 时间: 2022-8-28 08:08
回复 28# jcrh_bf
要明白其中的原理才可套用,你这有点不伦不类。不知你到底要实现什么目的?
作者: fzp070 时间: 2022-8-28 15:43
回复 28# jcrh_bf
move "%%i" E:\2022年\8月\27日\"%%i"
move "%%i#%%j" E:\2022年\8月\27日\"%%i~!n!.pdf"
其他不说,你这移动的命令,后面路径不需要%%i,直接如下即可:- move "%%i" E:\2022年\8月\27日
- move "%%i#%%j" E:\2022年\8月\27日
复制代码
注意这个目录E:\2022年\8月\27日必须是已存在的,如果没有,要先创建
作者: WHY 时间: 2022-8-28 22:11
在批处理中,如果碰到文件名后面为~1、~2、~3这种后缀需小心
因为8.3格式的短文件名后面刚好就是~1、~2、~3
http://www.bathome.net/thread-37534-1-1.html
PowerShell 不存在这个问题
作者: jcrh_bf 时间: 2022-8-28 22:22
本帖最后由 jcrh_bf 于 2022-8-28 23:50 编辑
回复 29# qixiaobin0715
就是把任一文件按规则命名文件(比如文件中有#号),留#号前半部分剪切到另外一个文件夹,如果目标文件夹有相同名称的文件自动再后面按顺序加(1) (2)(3)......
现在修改了几次,如果重复一次加~1没问题,后面继续就没法加~2 3 4了,应该只是识别到第一个条件反复吧~1替换了,
应该 for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1,定位到目标位置,这句现在语法有问题是不是没有定位到目标位置
@echo off
setlocal enabledelayedexpansion
for /f "tokens=1* delims=." %%i in ('dir /b /a-d *.pdf') do (
if not exist "E:\2022年\8月\27日\%%i.pdf" (
move "%%i.%%j" E:\2022年\8月\27日
) else (
set n=1
for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1
move "%%i.%%j" E:\2022年\8月\27日\"%%i~!n!.pdf"
)
)
pause
作者: jcrh_bf 时间: 2022-8-28 22:30
本帖最后由 jcrh_bf 于 2022-8-28 22:47 编辑
回复 30# fzp070
这样改后,显示移动文件成功,第一次没有重复的移动成功,后面有重复的,源文件夹文件不见了,但是目标文件夹里面没有文件
@echo off
setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
for /f "delims=" %%i in ("%%i") do (
if not exist "%%i.pdf" (
move "%%i" E:\2022年\8月\27日
) else (
set n=1
for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1
move "%%i#%%j" E:\2022年\8月\27日
)
))
pause
作者: jcrh_bf 时间: 2022-8-28 22:34
回复 32# WHY
应该改成(n)就没有问题吧
作者: fzp070 时间: 2022-8-28 23:02
回复 34# jcrh_bf
好的,了解了
作者: qixiaobin0715 时间: 2022-8-29 09:38
本帖最后由 qixiaobin0715 于 2022-8-29 16:07 编辑
回复 33# jcrh_bf
假设源文件路径为:C:\2022\8\27
目标路径为:E:\2022\8\27
在10楼代码第1~2行之间加上下面几行:- cd /d "C:\2022\8\27"
- copy "*#*.pdf" "E:\2022\8\27"
- cd /d "E:\2022\8\27"
复制代码
批处理文件可放在任意地方。
作者: jcrh_bf 时间: 2022-8-29 09:58
回复 37# qixiaobin0715
你好,现在的问题应该下面这段代码用于剪切操作,有问题,不能识别~1 ~2 ……,这些,只有当有和源文件名一样的才重命名为~1,当有~的文件后,没法识别道继续+1变为~2,直接就把~1替换了
) else (
set n=1
for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1
move "%%i#%%j" E:\2022年\8月\27日
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |