批量删除文件名中特定字符前后的文本

Batch for removing a text after and before specific characters in files names

我有这种文件命名系统

CR - 计划 - Grundriss_RO_STA_MA_C7_TS_0001_01_F - 计划 Nord.pdf

我想要一个 .bat 文件,删除前后的部分并将文件名更改为

Grundriss_RO_STA_MA_C7_TS_0001_01_F.pdf

前后部分的长度并不总是相同!

如果您能提供帮助,我将不胜感激!非常感谢。

此代码可用于复制到批处理文件中,该批处理文件与要重命名的文件一起保存到目录中。

@echo off
for /F "eol=| delims=" %%I in ('dir /A-D /B *-*-* 2^>nul') do (
    for /F "eol=| tokens=3 delims=- " %%J in ("%%~nI") do ren "%%I" "%%J%%~xI"
)

我建议在命令提示符下插入命令 ECHO 到命令 REN 和 运行 批处理文件 window 当前目录是包含要重命名的文件的目录,以首先验证文件是否按预期重命名。如果一切正常,运行 包含已发布代码的批处理文件。

外层FOR循环运行s DIR因为参数/A-D(属性不是目录)和 /B(裸输出格式)文件名中至少有两个破折号的文件。 "eol=| delims=" 将竖线定义为行尾字符,任何文件名都不能包含该字符,以处理以 ; 开头的正确文件名,并定义一个空的字符串分隔符列表以禁用拆分每个输出的默认值使用普通 space 和水平制表符作为分隔符将 DIR 行转换为字符串。

内部 FOR 循环仅处理每个文件的名称,不带双引号中 %%~nI 引用的文件扩展名。此任务感兴趣的只是文件名的第三部分,在两个 space 和破折号序列之后。这就是 "eol=| tokens=3 delims=- ".

的原因

命令 RENDIR 返回的当前文件重命名为 [=17= 引用的第三部分和原始文件扩展名].

引用文件名时必须使用双引号,因为文件名包含 spaces.

要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • for /?
  • ren /?

2^>nul 将命令 DIR 输出的错误消息重定向到处理 STDERR 以防没有文件匹配模式 *-*-* 发现设备 NUL 以抑制它。重定向运算符 > 必须在此处使用 ^ 进行转义,以便在执行命令 DIR 时被解释为重定向运算符,而不是命令 [=43] 的错误放置的重定向运算符=]对于。另请参阅有关 Using command redirection operators.

的 Microsoft 文档