Board logo

标题: [文本处理] 【已解决】批处理如何去除文件名最后几位指定字符? [打印本页]

作者: purehu    时间: 2022-6-28 21:54     标题: 【已解决】批处理如何去除文件名最后几位指定字符?

本帖最后由 purehu 于 2022-6-29 11:31 编辑

我的问题有点奇怪,试了多种方法了,还是不完美。特请教各位,感激不尽!

同一目录下有多个文件,文件名诸如:
123456 (2).pdf
qq(2)123456 (2).pdf
autocad说明书 (2).doc
C++从入门到入土 (2).pptx
参考(2)资料 (2).dxf
项目节点 (2).xls


只需要批量去掉文件名中最后面的  (2)  <注意,(前有空格>     其余地方的 (2)需要保留

最后希望得到的文件名如下:
123456.pdf
qq(2)123456.pdf
autocad说明书.doc
C从入门到入土.pptx
参考(2)资料.dxf
项目节点.xls
作者: purehu    时间: 2022-6-28 22:00

本帖最后由 purehu 于 2022-6-28 22:03 编辑

已尝试方法一
穷举每一种文件类型,例如pdf文件,采用如下脚本
  1. setlocal enabledelayedexpansion
  2. for %%f in (*.pdf) do (
  3. pause
  4. echo %%f
  5. set name=%%f
  6. ren !name! !name:~0,-8%!.pdf
  7. )
复制代码
存在问题:因为文件名中存在空格,无法有效的删除指定位置的“ (2)”四位字符
作者: purehu    时间: 2022-6-28 22:03

已尝试方法二
直接替换" (2)"字符,脚本如下:
  1. SetLocal ENABLEDELAYEDEXPANSION
  2. FOR %%a in (*) do (
  3. ::pause
  4. set "name=%%a"
  5. set "name=!name: (2)=!"
  6. ::set "name=!name: (=!"
  7. ::set "name=!name=!"
  8. ren "%%a" "!name!"
  9. )
复制代码
存在问题,因为文件名中可能存在多处" (2)",但我只希望删除文件最后的一处,因此存在误删的可能
作者: yyz219    时间: 2022-6-28 22:18

本帖最后由 yyz219 于 2022-6-28 22:55 编辑
已尝试方法二
直接替换" (2)"字符,脚本如下:存在问题,因为文件名中可能存在多处" (2)",但我只希望删除 ...
purehu 发表于 2022-6-28 22:03


试一试下面的代码(做好备份哦)
  1. ::【文件名去"最后的 (2)"字符】
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /s /b /a-d *.*') do (
  5.     set "FN=%%~nxi"
  6.     if not "%%i"=="%~0" move "%%i" "!FN: (2).=.!")
  7. pause >nul
复制代码
批处理放到需要修改的文件所在目录【这代码的巧妙之处是:把 (2)后面的 “.” 也加进去,这样就不会删除前面的 (2)】
作者: purehu    时间: 2022-6-28 22:33

回复 4# yyz219


    谢谢大神回复,前面的(2)也有空格,被误删了
作者: yyz219    时间: 2022-6-28 22:38

本帖最后由 yyz219 于 2022-6-28 22:46 编辑

回复 5# purehu


    3楼代码已修改,再试一试
作者: purehu    时间: 2022-6-28 23:15

回复 6# yyz219


    实测有效!!!!感谢大神相助
作者: yyz219    时间: 2022-6-29 08:13

回复  yyz219


    实测有效!!!!感谢大神相助
purehu 发表于 2022-6-28 23:15


不要谢

如果问题已经解决,麻烦编辑主题为:【已解决】
作者: yyz219    时间: 2022-6-29 08:43

回复 9# qixiaobin0715


    他需要修改的文件,就是有几个不同的后缀的哦
作者: qixiaobin0715    时间: 2022-6-29 09:04

回复 2# purehu
方法一可以这样:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%a in ('dir /b /a-d "* (2).????"') do (
  4.     set str=%%~na
  5.     if not "%~xa"==".bat" ren "%%a" "!str:~,-4!%%~xa"
  6. )
  7. pause
复制代码
dir过滤一下,只查找文件名以“ (2)”结尾的文件,以防ren误将其他文件重命名。
作者: qixiaobin0715    时间: 2022-6-29 09:06

回复 9# yyz219
开始没仔细看,用列举法最好,或者像楼上的方法。
作者: qixiaobin0715    时间: 2022-6-29 09:20

本帖最后由 qixiaobin0715 于 2022-6-29 10:39 编辑

回复 4# yyz219
如果用dir/s包含子文件夹中的文件,这样使用move命令是不合适的,会把子文件夹中的文件移动到当前文件夹。
若是非要使用move命令的话,需要加上路径:
  1. move "%%i" "%%~dpi!FN: (2)%%~xi=%%~xi!"
复制代码
重命名如果没有特殊情况还是使用ren的好。
作者: yyz219    时间: 2022-6-29 10:03

回复  yyz219
如果用dir/s包含子文件夹中的文件,这样使用move命令是不合适的,会把子文件夹中的文件移动 ...
qixiaobin0715 发表于 2022-6-29 09:20


受教了,感谢指导
作者: yyz219    时间: 2022-6-29 10:57

回复 1# purehu


    经 qixiaobin0715  提醒,代码 move 应该改为  ren,变为下面的才完善【否则,子文件夹中符合条件的文件,会移动到批处理目录】
  1. ::【文件名去"最后的 (2)"字符】
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "delims=" %%i in ('dir /s /b /a-d *.*') do (
  5.     set "FN=%%~nxi"
  6.     if not "%%i"=="%~0" ren "%%i" "!FN: (2).=.!")
  7. pause >nul
复制代码

作者: yyz219    时间: 2022-6-29 11:01

回复 10# qixiaobin0715


    我运行这些代码,没有反应哦
作者: purehu    时间: 2022-6-29 11:30

不要谢

如果问题已经解决,麻烦编辑主题为:【已解决】
yyz219 发表于 2022-6-29 08:13



  
作者: purehu    时间: 2022-6-29 11:30

回复 10# qixiaobin0715


    感谢指导!!!
作者: purehu    时间: 2022-6-29 11:31

回复 14# yyz219


    再次感谢!新代码确实更好用
作者: qixiaobin0715    时间: 2022-6-29 11:37

回复 15# yyz219
漏写了一个百分号。
代码第5行“%~xa”改为“%%~xa”
作者: aloha20200628    时间: 2022-6-29 12:28

建议使用一个更准确的判据...代码如下(代码脚本须与被更名文件同目录):
@echo off &setlocal EnableDelayedExpansion
for /f "delims=" %%F in (' dir/b/a-d "* (2).*" ') do (
     set "fn=%%~nF"
     if "!fn:~-4!" == " (2)" (ren "%%F" "!fn:~,-4!%%~xF!")
)
作者: purehu    时间: 2022-6-29 21:27

回复 20# aloha20200628


感谢大神指导!!!
在大家的无私帮助下,代码质量越来越高了!
作者: tony76779    时间: 2022-6-30 09:13

受教了,感谢指导




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