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

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

本帖最后由 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 编辑 ]
1

评分人数

    • batman: 感谢给帖子标题标注[已解决]字样PB + 2

  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. )
复制代码
***共同提高***

TOP

非常谢谢batman,问题圆满解决。

TOP

以上代码只适用于各分隔符间字符串不相同的情况如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 编辑 ]
2

评分人数

***共同提高***

TOP

谢谢batman,真的帮了大忙,也学习你严谨的科学精神。

TOP

既然文件名不可能存在特殊字符\,那貌似可以这样:
  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. )
复制代码

TOP

谢谢zm900612,不过你的代码好像有点小问题,可能还要小修改一下。

TOP

出错大概是因为少了后缀名吧
  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. )
复制代码
1

评分人数

TOP

用了一下SED,感觉还行
  1. @echo off
  2. sed s/_[0-9].*//g 1.txt
  3. pause
复制代码
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

  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
复制代码
1

评分人数

TOP

terse的也不错,枫中残雪的好像要在linux下使用才行,zm900612的还是有点小问题,谢谢大家!

[ 本帖最后由 liht1024 于 2011-3-10 08:44 编辑 ]

TOP

回复 11楼 的帖子

Window也行,命令行工具 sed.exe 下载地址:
http://bbs.bathome.net/thread-1114-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 12楼 的帖子

非常感谢指教,在linux下试了,却没有想到在windows下安装unix工具。

TOP

回复 8# CrLf


    运行时,出现命令语法不正确

TOP

请问一下,如果要删除_之前的字符,应该怎么修改呢!谢谢

TOP

返回列表