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

[文件操作] 批处理如何修改带特点符号文件名?

[复制链接]
发表于 2022-8-25 22:04:52 | 显示全部楼层 |阅读模式
想修改特定文件夹下,特定文件名称,如:
E:盘里面文件  5862#332.pdf   需要把#和后面数字去掉重命名为 5862.pdf
建立如下批处理命令,出现个问题,第一次运行后能正常命名,但是如果后面重复命名后,就会不停的在后面加.pdf运行一次加一次变成5862.pdf.pdf.pdf
请问下如下命令怎么改下,如果文件名称中没有#这个符号就不从新命名
  1. cd /d E:\8.25
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  4.     for /f "tokens=1 delims=-#" %%a in ("%%i") do (
  5.         ren "%%i" "%%a "
  6.     )
  7. )
复制代码
发表于 2022-8-25 22:25:16 | 显示全部楼层
将重命名后的文件移到其它路径,比如在当前文件夹内再建个文件夹放置。
发表于 2022-8-25 22:59:02 | 显示全部楼层
  1. dir /b /a-d *?#?*.pdf
复制代码
 楼主| 发表于 2022-8-25 23:08:55 | 显示全部楼层
将重命名后的文件移到其它路径,比如在当前文件夹内再建个文件夹放置。
fzp070 发表于 2022-8-25 22:25

不会批处理命令,请问下,改名移动到另外指定文件夹,怎么改加一段什么命令比如,移动到E】E:\test 文件夹下
 楼主| 发表于 2022-8-25 23:09:05 | 显示全部楼层
本帖最后由 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  可以了,谢谢
发表于 2022-8-25 23:33:00 | 显示全部楼层
回复 4# jcrh_bf


    看你5楼,是好了是吧。

移动就是在ren下加 move "%%a" E:\test
我刚试你的代码,发现在我电脑上运行(Win11),后缀.pdf也没了,所以我改成这样在我电脑上运行也可以
  1. setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  3.     for /f "tokens=1 delims=-#" %%a in ("%%i") do (
  4.         ren "%%i" "%%a.tmp"
  5.     )
  6. )
  7. ren  *.tmp *.pdf
  8. pause
复制代码
 楼主| 发表于 2022-8-25 23:41:33 | 显示全部楼层
回复 6# fzp070
谢谢上面的问题好了,又遇到个问题,如果有改名后有相同文件名的文件他就不自动命名了
能不能把 相同文件名替换掉或者  如果有相同文件名后面加~1  ~2  ~3  这种
发表于 2022-8-25 23:57:39 | 显示全部楼层
回复 7# jcrh_bf

在6楼代码上改的,你自己将set n之类的换到你要的代码中去
  1. setlocal enabledelayedexpansion
  2. set n=0
  3. for /f "delims=" %%i in ('dir /b /a-d *.pdf') do (
  4.    set /a n+=1
  5.     for /f "tokens=1 delims=-#" %%a in ("%%i") do (
  6.         ren "%%i" "%%a!n!.tmp"
  7.     )
  8. )
  9. ren  *.tmp *.pdf
  10. pause
复制代码
发表于 2022-8-26 08:42:12 | 显示全部楼层

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /a-d *.pdf^|find "#"') do (
  4.     for /f "tokens=1 delims=#" %%b in ("%%a") do (
  5.         if exist "%%~b.pdf" (
  6.                         set /a n=1
  7.                         call :No_DupFile "%%~b"
  8.                         ren "%%~a" "%%~b~!n!.pdf"
  9.                 ) else (
  10.                         ren "%%~a" "%%~b.pdf"
  11.                 )
  12.     )
  13. )
  14. endlocal
  15. exit/b
  16. :No_DupFile
  17. if exist "%~1~!n!.pdf" (
  18.     set /a n+=1
  19.     goto :No_DupFile
  20. )
复制代码
发表于 2022-8-26 08:56:39 | 显示全部楼层
本帖最后由 qixiaobin0715 于 2022-8-26 16:43 编辑

回复 7# jcrh_bf
一个不是太精确的代码:
重名文件必须严格按照楼主提供的规则命名,即顺序号是~1、~2、~3...等(包括已有的,已经命名过的重名文件)构成,中间不能有断档(比如存在~1,~3,而没有~2)
代码保存为ANSI编码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=1* delims=#" %%i in ('dir /b /a-d *#*.pdf') do (
  4.     if not exist "%%i.pdf" (
  5.         ren "%%i#%%j" "%%i.pdf"
  6.     ) else (
  7.         set n=1
  8.         for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|findstr /ber "%%i~[0-9]*\.pdf"') do set /a n+=1
  9.         ren "%%i#%%j" "%%i~!n!.pdf"
  10.     )
  11. )
  12. pause
复制代码
注意代码未经测试。
发表于 2022-8-26 09:28:54 | 显示全部楼层
回复 10# qixiaobin0715


高手!!!学习的标杆!!!

纯探讨一下,如果把第7、8两行合并如下:

  1. for /f "delims=" %%k in ('dir /b /a-d %%i~*.pdf 2^>nul^|find /c ".pdf"') do set /a n=%%k+1
复制代码
是不是对于俺这样的新手来说更容易理解一点
发表于 2022-8-26 09:34:36 | 显示全部楼层
回复 10# qixiaobin0715


    哦,抱歉,没注意 findstr /ber 使用正则表达式的严格探索,班门弄斧了
发表于 2022-8-26 10:01:06 | 显示全部楼层
回复 11# hfxiang
主要是防止出现类似这样的文件名:
abc#jh.pdf
abc~mn.pdf
发表于 2022-8-26 10:17:49 | 显示全部楼层
回复 11# hfxiang
退一步来说,即使没有特殊情况,也是需要的,第一个重名文件命名也是需要n值的。你那样,n=1就永远取不到。
 楼主| 发表于 2022-8-26 15:59:05 | 显示全部楼层
回复 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 18:12 , Processed in 0.021862 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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