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

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

本帖最后由 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: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)”四位字符

TOP

已尝试方法二
直接替换" (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)",但我只希望删除文件最后的一处,因此存在误删的可能

TOP

本帖最后由 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)】
我是小白,希望老师多多帮助

TOP

回复 4# yyz219


    谢谢大神回复,前面的(2)也有空格,被误删了

TOP

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

回复 5# purehu


    3楼代码已修改,再试一试
我是小白,希望老师多多帮助

TOP

回复 6# yyz219


    实测有效!!!!感谢大神相助

TOP

回复  yyz219


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


不要谢

如果问题已经解决,麻烦编辑主题为:【已解决】
我是小白,希望老师多多帮助

TOP

回复 9# qixiaobin0715


    他需要修改的文件,就是有几个不同的后缀的哦
我是小白,希望老师多多帮助

TOP

回复 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误将其他文件重命名。

TOP

回复 9# yyz219
开始没仔细看,用列举法最好,或者像楼上的方法。

TOP

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

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

TOP

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


受教了,感谢指导
我是小白,希望老师多多帮助

TOP

回复 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
复制代码
我是小白,希望老师多多帮助

TOP

回复 10# qixiaobin0715


    我运行这些代码,没有反应哦
我是小白,希望老师多多帮助

TOP

返回列表