截断Windows批处理脚本中的一个特殊字符的多个文件名?

我想从第几个文件中删除第三个“_”之后的文件名部分。 第三个“_”之后的结构在一些情况下变化并且包含“_”。 第一部分的长度不同,所以我不能删除前15个字符。 结果应该是独一无二的。

文件名如下所示:

00_TEXT_=Text00._AA1234L_AA1_1.pdf 00_TEX_=Text00._AA1234L_AA1_2.pdf 00_TEXT_=TextText00._DD2023A.pdf 00_TEXT_=Text00._AA2345L_BB1_1.pdf 00_TEXT_=Text00._AA2345L_BB1_2.pdf 

结果应该是这样的:

 AA1234L_AA1_1.pdf AA1234L_AA1_2.pdf DD2023A.pdf AA2345L_BB1_1.pdf AA2345L_BB1_2.pdf 

任何想法,为什么这是行不通的:

 @echo off setlocal enabledelayedexpansion set deletestring=*_*_*_ for /f "delims==" %%F in ('dir /b ^| find "%deletestring%"') do ( set oldfilename=%%F set newfilename=!oldfilename:%deletestring%=! Ren "!oldfilename!" "!newfilename!" ) 

我能够得到它与这个工作:

 @echo off setlocal enabledelayedexpansion set deletestring=*_*_*_* for /f "tokens=1,2,3,* delims=_" %%F in ('dir /b "%deletestring%"') do ( Ren "%%F_%%G_%%H_%%I" "%%I" ) endlocal 

请注意, enabledelayedexpansion是不是真的需要在上面。

或者,你可以做一个单行(不需要批处理文件):

 for /f "tokens=1,2,3,* delims=_" %F in ('dir /b "*_*_*_*"') do Ren "%F_%G_%H_%I" "%I" 

这个想法是简单地将匹配的文件名拆分为下划线,然后在重命名过程中重建名称( %%F_%%G_%%H_%%I通过循环时给出原始文件名)。 然后将文件重命名为第三个下划线(即%%I值)后面的所有内容。

您的FINDSTR搜索错误 – 任何字符(通配符)的字符串是.* ,而不是*

变量查找/替换不支持通配符,除了!var:*search=! 用于替换“搜索”的语法。

没有必要FINDSTR,所有你需要的是与普通的通配符掩码的DIR。

您可以使用FOR / F将名称解析为令牌。 我使用两个循环 – 第一个获得全名,第二个解析第三个_之后的部分。

以下应该工作:

 @echo off for /f "eol=: delims=" %%A in ( 'dir /b /ad *_*_*_*' ) do for /f "tokens=3* delims=_" %%B in ("%%A") do ren "%%A" "%%C" 

或者你可以使用我的jren.bat实用程序 ,使用正则表达式替换重命名文件。 这是一个混合的JScript /批处理脚本,可以从XP以后的任何Windows机器上本地运行。

 jren "^(.*?_){3}" "" 

如果将命令放入另一个批处理脚本中,请使用CALL JREN。