Board logo

标题: [文本处理] 【已解决】批处理能否同时删除文件名前后特定字符串? [打印本页]

作者: tearboy    时间: 2009-5-22 00:52     标题: 【已解决】批处理能否同时删除文件名前后特定字符串?

本帖最后由 pcl_test 于 2016-7-18 13:09 编辑

我有这样一些文件:SDI_cad12_k010002_dft_a2.prt,SDI_k010003_dft_a3_sht.prt等等
它们文件名的前缀与后缀都不一样长,我想删掉它们的前缀和后缀得到:k010002_dft .prt, k010003_dft .prt等,新得到文件名的字符长度是一样的。
能否实现:当文件有前缀及后缀时将前后缀删掉,而无前后缀的文件名不会改动,能否用批处理实现? 谢谢各位大侠了!!!!

补充说明:

原始文件名               目标文件名

SDI_cad12_k010002_dft_a2.prt       k010002_dft .prt
SDI_k010003_dft_a3_sht.prt            k010003_dft .prt
SDI_cad12_k010004_dft_a2_sht.prt          k010004_dft .prt

红色为希望得到的文件名,原始文件名里始终只有一个K,K后面只有一个_dft,只需截取从K开始到_dft结尾的字符作为新文件名(文件名长度可以不限),扩展名为.prt:【已解决】,

[ 本帖最后由 tearboy 于 2009-5-28 23:05 编辑 ]
作者: flyinspace    时间: 2009-5-22 02:01

@echo off
for /f "tokens=*" %%i in ('dir /b ') do call :GetName "%%i"
goto :EOF
:GetName _FileName_
for /f  "delims=_ tokens=3" %%i in ("%1") do ren %1 "%%i" & goto :EOF
作者: flyinspace    时间: 2009-5-22 02:03

假设要改名的文件在当前目录下
@echo off
for /f "tokens=*" %%i in ('dir /b') do call :GetName "%%i"
pause
goto :EOF
:GetName _FileName_
for /f  "delims=_ tokens=3" %%i in (%1) do echo %1 "%%i" & goto :EOF
作者: tireless    时间: 2009-5-22 02:50

如果文件名是 7 位,后缀名固定,文件名中不含 !
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in ("*_*.prt_*") do (
  3.   set Name=%%~na
  4.   ren "%%a" "!Name:~-7!.prt"
  5. )
  6. pause
复制代码

[ 本帖最后由 tireless 于 2009-5-22 02:57 编辑 ]
作者: tearboy    时间: 2009-5-27 17:42

文件名没有被更改。



原帖由 flyinspace 于 2009-5-22 02:03 发表
假设要改名的文件在当前目录下
@echo off
for /f "tokens=*" %%i in ('dir /b') do call :GetName "%%i"
pause
goto :EOF
:GetName _FileName_
for /f  "delims=_ tokens=3" %%i in (%1) do echo %1 "%%i" & g ...

作者: tearboy    时间: 2009-5-27 17:45

谢谢,但文件名还是没有被更改。

原帖由 tireless 于 2009-5-22 02:50 发表
如果文件名是 7 位,后缀名固定,文件名中不含 !@echo off&setlocal enabledelayedexpansion
for %%a in ("*_*.prt_*") do (
  set Name=%%~na
  ren "%%a" "!Name:~-7!.prt"
)
pause

作者: wxcute    时间: 2009-5-27 18:38

请确定前后缀是用短线 _ 来分隔。
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b') do call :RP "%%i"
  3. goto :eof
  4. :RP
  5. set fn=%~1
  6. set fn=%fn:_=;%
  7. for %%f in (%fn%) do if not "%%~nf"=="%%~nxf" ren %1 "%%f"
复制代码

作者: tearboy    时间: 2009-5-27 20:17

谢谢版主出手,是不是条件太苛刻啦,还是没有成功,名字没有发生改变,我把名字改成*_name _*后也没成功。
如果一步不行的话,两步行不行,第一步去除前缀,去除后缀就好办了。

原帖由 wxcute 于 2009-5-27 18:38 发表
请确定前后缀是用短线 _ 来分隔。@echo off
for /f "delims=" %%i in ('dir/b') do call :RP "%%i"
goto :eof
:RP
set fn=%~1
set fn=%fn:_=;%
for %%f in (%fn%) do if not "%%~nf"=="%%~nxf" ren %1 "%%f"

作者: 随风    时间: 2009-5-27 20:25

楼主只给出一个文件名的样本,并没有说明该按怎样的规律来改名,相信很多人都是无法对题意正确的理解而放弃对此题的解答。
若能详细说明具体情况,这应该是个很容易的问题。。。
作者: tearboy    时间: 2009-5-27 20:42     标题: 回复 9楼 的帖子

谢谢提醒,我补充说明了。
作者: 随风    时间: 2009-5-27 20:53

虽然补充了几个样本,但仍不知道规律在哪?而且越看越糊涂。
顶楼中 红色为希望得到的文件名 红色部分是如何确定的?
如果没有规律的话就只有手工完成了,别说批处理,恐怕任何软件都无法完成。
看你补充的这三个文件名,规律是截取以 k开头至_dft段为目标文件名,但最初给出的样本文件名又不是这样??
晕了。。。。。。。
作者: namejm    时间: 2009-5-27 21:45

  你是如何确定红色的部分就是你想要的?请用文字描述它的规律,而不仅仅是在顶楼用红色标注它们在哪个地方,虽然你可能知道哪部分是你想要的,但是别人是没法知道的。请完整地描述文件名的规律。
作者: tearboy    时间: 2009-5-28 08:08

文件名的唯一规律就是需要截取的文件名长度是相同的,以K开头,以dft结尾。我补充的三个是实际文件名,贴子开头是举的例子。
因为文件名前缀长度不一样,所以不知道批处理能不能实现。

原帖由 随风 于 2009-5-27 20:53 发表
虽然补充了几个样本,但仍不知道规律在哪?而且越看越糊涂。
顶楼中 红色为希望得到的文件名 红色部分是如何确定的?
如果没有规律的话就只有手工完成了,别说批处理,恐怕任何软件都无法完成。
看你补充的这三个 ...

作者: namejm    时间: 2009-5-28 09:44

  如果是截取以k开头、长度固定且以dft结尾的字符串,批处理很容易办到,请先确认文件名中是不是只有一个k?如果有多个k,是不是从第一个k算起?还有,你的文件没有后缀名吗?请把你的信息补全——帮别人写代码最怕得到的信息不全,辛辛苦苦写了一堆代码,然后别人再补充一下条件,结果发现自己全在做无用功,杀人的心都有,在没得到楼主的详细信息前,估计是没人再干这样的傻事了。
作者: tearboy    时间: 2009-5-28 17:19

添麻烦了,补全了。
原帖由 namejm 于 2009-5-28 09:44 发表
  如果是截取以k开头、长度固定且以dft结尾的字符串,批处理很容易办到,请先确认文件名中是不是只有一个k?如果有多个k,是不是从第一个k算起?还有,你的文件没有后缀名吗?请把你的信息补全——帮别人写代码最怕 ...

作者: tearboy    时间: 2009-5-28 17:21     标题: 回复 14楼 的帖子

只需要以K开头,以_dft结尾就OK了,因为文件名中只有一个K,且只有一个_dft。
作者: 随风    时间: 2009-5-28 17:34

  1. @echo off
  2. for /f "delims=" %%i in ('dir/b *.prt') do (
  3.    set "str=%%~ni"
  4.    setlocal enabledelayedexpansion
  5.    set "str=a!str:_dft=k!"
  6.    for /f "tokens=2 delims=k" %%a in ("!str!") do set "str=k%%a_dft"
  7.    ren "%%i" "!str!.prt"
  8.    endlocal
  9. )
  10. pause
复制代码

[ 本帖最后由 随风 于 2009-5-28 17:37 编辑 ]
作者: Batcher    时间: 2009-5-28 17:40

它们文件名的前缀与后缀都不一样长,我想删掉它们的前缀和后缀得到:k010002_dft .prt, k010003_dft .prt等,新得到文件名的字符长度是一样的

红色为希望得到的文件名,原始文件名里始终只有一个K,K后面只有一个_dft,只需截取从K开始到_dft结尾的字符作为新文件名(文件名长度可以不限),扩展名为.prt


你想得到的新文件名长度到底是不是固定的呢?
作者: namejm    时间: 2009-5-28 17:46

  楼主的要求一变再变,很让人怀疑你在顶楼的描述是不是你真正的需求,并且在顶楼的描述仍然让人疑窦丛生:虽然你说文件名中有且只有一个k和一个_dft,但是,你并没有说明是不是所有的prt文件都有这两串字符;括号中的“文件名长度不限”到底指原文件名长度未知还是重命名后的文件名长度不定。

  唉,罢了罢了,还是选一种很简单的情况给段演示代码吧,至于能不能解决你的问题,就看你的造化了。

  以下代码适应这样一种情形:prt文件中一定含有一个k,没有字符!,并且,从第一个k开始的前11个字符是你想要的新文件名。情况是非常简单的,代码也是很短的,如果屏幕显示正确,请把 echo 语句中的 echo 去掉,才会真正地重命名,let's go :
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "delims=" %%i in ('dir /a-d /b *.prt') do (
  4.     set "str=%%i"
  5.     set "str=!str:*k=k!"
  6.     set "str=!str:~0,11!"
  7.     echo ren "%%i" "!str!.prt"
  8. )
  9. pause
复制代码

作者: 随风    时间: 2009-5-28 17:55

看楼主的描述,19楼代码直接截取11位字符估计是不行的。
文件名都有且只有一个k和_dft,兼容文件名含!符号的情况。
:
  1. @echo off
  2. for /f "delims=" %%i in ('dir/b/a-d *.prt') do (
  3.    set "str=%%i"
  4.    setlocal enabledelayedexpansion
  5.    set "str2=!str:*k=!"
  6.    set "str3=!str2:*_dft=!"
  7.    for %%a in (!str3!) do echo ren "!str!" "k!str2:%%a=!.prt"
  8.    endlocal
  9. )
  10. pause
复制代码

[ 本帖最后由 随风 于 2009-5-28 17:57 编辑 ]
作者: tearboy    时间: 2009-5-28 20:41

难为版主了,显示找不到文件。
嘻嘻,太不好意思了。

原帖由 随风 于 2009-5-28 17:55 发表
看楼主的描述,19楼代码直接截取11位字符估计是不行的。
文件名都有且只有一个k和_dft,兼容文件名含!符号的情况。
echo off
for /f "delims=" %%i in ('dir/b/a-d *.prt') do (
   set "str=%%i"
   setloc ...

作者: tearboy    时间: 2009-5-28 20:43

难为管理员了,我的要求就是要把前面的后面的去掉留下中间的,表达能力不足请管理员谅解呀。
还有就是也是提示找不到文件。

原帖由 namejm 于 2009-5-28 17:46 发表
  楼主的要求一变再变,很让人怀疑你在顶楼的描述是不是你真正的需求,并且在顶楼的描述仍然让人疑窦丛生:虽然你说文件名中有且只有一个k和一个_dft,但是,你并没有说明是不是所有的prt文件都有这两串字符;括号 ...

作者: Batcher    时间: 2009-5-28 20:47     标题: 回复 21楼 的帖子

1、你把批处理放在什么地方执行的?
2、把@echo off删除,看看是哪个命令出错了。
作者: tearboy    时间: 2009-5-28 20:48

太感谢啦,成功啦!!!!!!!!!!!!!!!!!!!!!!!!!

原帖由 随风 于 2009-5-28 17:55 发表
看楼主的描述,19楼代码直接截取11位字符估计是不行的。
文件名都有且只有一个k和_dft,兼容文件名含!符号的情况。
echo off
for /f "delims=" %%i in ('dir/b/a-d *.prt') do (
   set "str=%%i"
   setloc ...

作者: tearboy    时间: 2009-5-28 20:51

显示正确,也成功了,刚才调试用的文件扩展名不对,太谢谢你啦,添麻烦了。。。。。。

原帖由 namejm 于 2009-5-28 17:46 发表
  楼主的要求一变再变,很让人怀疑你在顶楼的描述是不是你真正的需求,并且在顶楼的描述仍然让人疑窦丛生:虽然你说文件名中有且只有一个k和一个_dft,但是,你并没有说明是不是所有的prt文件都有这两串字符;括号 ...

作者: tearboy    时间: 2009-5-28 21:08

谢谢版主,我在K与dft间再加入字符也可以得到正确的文件名。厉害。。。。。。。



原帖由 随风 于 2009-5-28 17:55 发表
看楼主的描述,19楼代码直接截取11位字符估计是不行的。
文件名都有且只有一个k和_dft,兼容文件名含!符号的情况。
echo off
for /f "delims=" %%i in ('dir/b/a-d *.prt') do (
   set "str=%%i"
   setloc ...





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2