标题: [文件操作] [已解决]批处理如何删除文件名最后一个指定分隔符及其后面的所有字符 [打印本页]
作者: liht1024 时间: 2011-3-9 11:25 标题: [已解决]批处理如何删除文件名最后一个指定分隔符及其后面的所有字符
本帖最后由 pcl_test 于 2016-9-28 23:11 编辑
一个文件夹中许多文件,如:
calycanthus_floridus_var_glaucus_862739.txt,
capsella_bursa_pastoris_001123358.txt,
carica_papaya_001671668.txt, ......,
我想删除最后的分隔符"_"和它后面的所有字符,结果变成
calycanthus_floridus_var_glaucus.txt,
capsella_bursa_pastoris.txt,
carica_papaya.txt, ......,
请求高手写一批处理程序完成,谢谢!
[ 本帖最后由 liht1024 于 2011-3-9 14:51 编辑 ]
作者: batman 时间: 2011-3-9 11:33
- @echo off&setlocal enabledelayedexpansion
- for /r %%a in (*) do (
- set "str=%%~na"&set "var=%%~na"
- for /l %%b in (1,1,20) do set "var=!var:*_=!"
- for %%b in (!var!) do set "str=!str:_%%b=!"
- ren "%%a" "!str!%%~xa"
- )
复制代码
作者: liht1024 时间: 2011-3-9 11:44
非常谢谢batman,问题圆满解决。
作者: batman 时间: 2011-3-9 11:53
以上代码只适用于各分隔符间字符串不相同的情况如a_b_c_d_e,遇到a_b_a_c_a这样的情况就不行了,如此就采用下面的方法:- @echo off&setlocal enabledelayedexpansion
- for /r %%a in (*) do (
- set "str="&set "var="&call :lp "%%~na"
- if defined var ren "%%a" "!var:~1!%%~xa"
- )
- goto :eof
- :lp
- if not defined str set "str=%~1"
- for /f "tokens=1* delims=_" %%a in ("%str%") do (
- if "%%b" neq "" set "var=%var%_%%a"&set "str=%%b"&goto lp
- )
复制代码
[ 本帖最后由 batman 于 2011-3-9 12:15 编辑 ]
作者: liht1024 时间: 2011-3-9 11:59
谢谢batman,真的帮了大忙,也学习你严谨的科学精神。
作者: CrLf 时间: 2011-3-9 12:40
既然文件名不可能存在特殊字符\,那貌似可以这样:- @echo off&setlocal enabledelayedexpansion
- for %%a in (*) do (
- set tmp=%%~nxa
- for %%b in ("!tmp:_=\!") do set tmp=%%~dpb
- set tmp=!tmp:\=_!
- ren "%%a" "!tmp:~0,-1!"
- )
复制代码
作者: liht1024 时间: 2011-3-9 13:51
谢谢zm900612,不过你的代码好像有点小问题,可能还要小修改一下。
作者: CrLf 时间: 2011-3-9 14:55
出错大概是因为少了后缀名吧- @echo off&setlocal enabledelayedexpansion
- for %%a in (*) do (
- set tmp=%%~nxa
- for %%b in ("!tmp:_=\!") do set tmp=%%~dpb
- set tmp=!tmp:\=_!
- ren "%%a" "!tmp:~0,-1!%%~xa"
- )
复制代码
作者: wc726842270 时间: 2011-3-9 14:59
用了一下SED,感觉还行- @echo off
- sed s/_[0-9].*//g 1.txt
- pause
复制代码
作者: terse 时间: 2011-3-9 16:06
- @REN *_*.* *_.* 2>nul
- @echo off&setlocal enabledelayedexpansion
- for %%a in (*_.*) do (
- set tmp=%%~na
- ren "%%a" "!TMP:~,-1!%%~xa" 2>nul
- )
- PAUSE
复制代码
作者: liht1024 时间: 2011-3-10 08:38
terse的也不错,枫中残雪的好像要在linux下使用才行,zm900612的还是有点小问题,谢谢大家!
[ 本帖最后由 liht1024 于 2011-3-10 08:44 编辑 ]
作者: Batcher 时间: 2011-3-10 09:39 标题: 回复 11楼 的帖子
Window也行,命令行工具 sed.exe 下载地址:
http://bbs.bathome.net/thread-1114-1-1.html
作者: liht1024 时间: 2011-3-10 09:52 标题: 回复 12楼 的帖子
非常感谢指教,在linux下试了,却没有想到在windows下安装unix工具。
作者: wangdao6699 时间: 2015-5-27 13:39
回复 8# CrLf
运行时,出现命令语法不正确
作者: xl1345 时间: 2017-6-8 11:50
请问一下,如果要删除_之前的字符,应该怎么修改呢!谢谢
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |