Board logo

标题: [文件操作] [已解决]批处理如何删除文件名最后一个指定分隔符及其后面的所有字符 [打印本页]

作者: 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

  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%a in (*) do (
  3.      set "str=%%~na"&set "var=%%~na"
  4.      for /l %%b in (1,1,20) do set "var=!var:*_=!"
  5.      for %%b in (!var!) do set "str=!str:_%%b=!"
  6.      ren "%%a" "!str!%%~xa"
  7. )
复制代码

作者: liht1024    时间: 2011-3-9 11:44

非常谢谢batman,问题圆满解决。
作者: batman    时间: 2011-3-9 11:53

以上代码只适用于各分隔符间字符串不相同的情况如a_b_c_d_e,遇到a_b_a_c_a这样的情况就不行了,如此就采用下面的方法:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /r %%a in (*) do (
  3.     set "str="&set "var="&call :lp "%%~na"
  4.     if defined var ren "%%a" "!var:~1!%%~xa"
  5. )
  6. goto :eof
  7. :lp
  8. if not defined str set "str=%~1"
  9. for /f "tokens=1* delims=_" %%a in ("%str%") do (
  10.     if "%%b" neq "" set "var=%var%_%%a"&set "str=%%b"&goto lp     
  11. )
复制代码

[ 本帖最后由 batman 于 2011-3-9 12:15 编辑 ]
作者: liht1024    时间: 2011-3-9 11:59

谢谢batman,真的帮了大忙,也学习你严谨的科学精神。
作者: CrLf    时间: 2011-3-9 12:40

既然文件名不可能存在特殊字符\,那貌似可以这样:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*) do (
  3.    set tmp=%%~nxa
  4.    for %%b in ("!tmp:_=\!") do set tmp=%%~dpb
  5.    set tmp=!tmp:\=_!
  6.    ren "%%a" "!tmp:~0,-1!"
  7. )
复制代码

作者: liht1024    时间: 2011-3-9 13:51

谢谢zm900612,不过你的代码好像有点小问题,可能还要小修改一下。
作者: CrLf    时间: 2011-3-9 14:55

出错大概是因为少了后缀名吧
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*) do (
  3.    set tmp=%%~nxa
  4.    for %%b in ("!tmp:_=\!") do set tmp=%%~dpb
  5.    set tmp=!tmp:\=_!
  6.    ren "%%a" "!tmp:~0,-1!%%~xa"
  7. )
复制代码

作者: wc726842270    时间: 2011-3-9 14:59

用了一下SED,感觉还行
  1. @echo off
  2. sed s/_[0-9].*//g 1.txt
  3. pause
复制代码

作者: terse    时间: 2011-3-9 16:06

  1. @REN *_*.* *_.* 2>nul
  2. @echo off&setlocal enabledelayedexpansion
  3. for %%a in (*_.*) do (
  4.    set tmp=%%~na
  5.    ren "%%a" "!TMP:~,-1!%%~xa" 2>nul
  6. )
  7. 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://bbs.bathome.net/) Powered by Discuz! 7.2