标题: [文本处理] 【已解决】批处理如何去除文件名最后几位指定字符? [打印本页]
作者: 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文件,采用如下脚本- setlocal enabledelayedexpansion
- for %%f in (*.pdf) do (
- pause
- echo %%f
- set name=%%f
- ren !name! !name:~0,-8%!.pdf
- )
复制代码
存在问题:因为文件名中存在空格,无法有效的删除指定位置的“ (2)”四位字符
作者: purehu 时间: 2022-6-28 22:03
已尝试方法二
直接替换" (2)"字符,脚本如下:- SetLocal ENABLEDELAYEDEXPANSION
- FOR %%a in (*) do (
- ::pause
- set "name=%%a"
- set "name=!name: (2)=!"
-
- ::set "name=!name: (=!"
- ::set "name=!name=!"
-
- ren "%%a" "!name!"
- )
复制代码
存在问题,因为文件名中可能存在多处" (2)",但我只希望删除文件最后的一处,因此存在误删的可能
作者: yyz219 时间: 2022-6-28 22:18
本帖最后由 yyz219 于 2022-6-28 22:55 编辑
已尝试方法二
直接替换" (2)"字符,脚本如下:存在问题,因为文件名中可能存在多处" (2)",但我只希望删除 ...
purehu 发表于 2022-6-28 22:03
试一试下面的代码(做好备份哦)- ::【文件名去"最后的 (2)"字符】
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s /b /a-d *.*') do (
- set "FN=%%~nxi"
- if not "%%i"=="%~0" move "%%i" "!FN: (2).=.!")
- 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
方法一可以这样:- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('dir /b /a-d "* (2).????"') do (
- set str=%%~na
- if not "%~xa"==".bat" ren "%%a" "!str:~,-4!%%~xa"
- )
- 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命令的话,需要加上路径:- 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,变为下面的才完善【否则,子文件夹中符合条件的文件,会移动到批处理目录】- ::【文件名去"最后的 (2)"字符】
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s /b /a-d *.*') do (
- set "FN=%%~nxi"
- if not "%%i"=="%~0" ren "%%i" "!FN: (2).=.!")
- 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 |