【问题标题】:Truncate filename after a multiple of a special character in windows batch script?在Windows批处理脚本中的多个特殊字符后截断文件名?
【发布时间】:2015-05-08 01:22:20
【问题描述】:

我想从数千个文件中删除第三个“_”之后的文件名部分。第三个“_”之后的结构有所不同,在某些情况下包含“_”。第一部分的长度各不相同,所以我不能只删除前 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!"
)

【问题讨论】:

  • 我用 %% 替换了 % 但它不起作用 - 控制台显示:!文件名! !文件名!

标签: windows batch-file rename


【解决方案1】:

我能够让它与这个一起工作:

@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 值。

【讨论】:

  • 谢谢你,成功了!连续的下划线不是问题,因为下划线是文件系统中的级别(直到第三个下划线),所以必须有一个文件夹名称。我感谢你们,也感谢 eryksun。
【解决方案2】:

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

变量查找/替换不支持通配符,!var:*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/批处理脚本,可以在 XP 以后的任何 Windows 机器上本地运行。

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

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

【讨论】:

  • @eryksun - 我修复了 delims 疏忽,谢谢。不应使用简单的 FOR,因为它可能导致同一个文件被多次重命名。 FOR /F 在开始迭代之前缓冲整个结果,因此保证只重命名文件一次。我添加了/a-d 选项来忽略目录名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-04
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多