在 windows 批处理脚本中的特殊字符的倍数后截断文件名?
Truncate filename after a multiple of a special character in windows batch script?
我想从数千个文件中删除第三个“_”之后的文件名部分。第三个“_”之后的结构有所不同,在某些情况下会包含“_”。第一部分的长度各不相同,所以我不能只删除前 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
在循环时给出原始文件名)。然后将文件重命名为第 3 个下划线后的所有内容,即 %%I
值。
您的 FINDSTR 搜索错误 - 任意字符(通配符)的字符串是 .*
,而不是 *
。
变量 find/replace 不支持通配符,除了 !var:*search=!
语法会替换 "search" 第一次出现之前的所有内容。
不需要 FINDSTR,您只需要带有普通通配符掩码的 DIR。
您可以使用 FOR /F 将名称解析为标记。我使用了两个循环——第一个循环获取整个名称,第二个循环解析第三个 _
.
之后的部分
以下应该有效:
@echo off
for /f "eol=: delims=" %%A in (
'dir /b /a-d *_*_*_*'
) do for /f "tokens=3* delims=_" %%B in ("%%A") do ren "%%A" "%%C"
或者您可以使用我的 jren.bat utility,它使用正则表达式替换重命名文件。它是一个混合 JScript/batch 脚本,可以在任何 Windows XP 以后的机器上本地运行。
jren "^(.*?_){3}" ""
如果将命令放在另一个批处理脚本中,请使用 CALL JREN。
我想从数千个文件中删除第三个“_”之后的文件名部分。第三个“_”之后的结构有所不同,在某些情况下会包含“_”。第一部分的长度各不相同,所以我不能只删除前 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
在循环时给出原始文件名)。然后将文件重命名为第 3 个下划线后的所有内容,即 %%I
值。
您的 FINDSTR 搜索错误 - 任意字符(通配符)的字符串是 .*
,而不是 *
。
变量 find/replace 不支持通配符,除了 !var:*search=!
语法会替换 "search" 第一次出现之前的所有内容。
不需要 FINDSTR,您只需要带有普通通配符掩码的 DIR。
您可以使用 FOR /F 将名称解析为标记。我使用了两个循环——第一个循环获取整个名称,第二个循环解析第三个 _
.
以下应该有效:
@echo off
for /f "eol=: delims=" %%A in (
'dir /b /a-d *_*_*_*'
) do for /f "tokens=3* delims=_" %%B in ("%%A") do ren "%%A" "%%C"
或者您可以使用我的 jren.bat utility,它使用正则表达式替换重命名文件。它是一个混合 JScript/batch 脚本,可以在任何 Windows XP 以后的机器上本地运行。
jren "^(.*?_){3}" ""
如果将命令放在另一个批处理脚本中,请使用 CALL JREN。