Windows 批处理文件用于替换文件名中的字符串

Windows 批处理文件用于替换文件名中的字符串

我正在尝试批量重命名包含以下名称模式的文件的文件夹中的文件:

xxxtemplatexxxxx.xlsx

我所用名字的一个例子是:

IDA_template - differentwordingshere.xlsx

x 可能不一样。我想用日期替换模板,例如 201307。

我试过

ren *template* *201307*

但它却将 201307 附加到了末尾。

在 bash 中我可能可以做

rename template 201307 *.xlsx

但不幸的是这将在 Windows 上进行。

.bat 文件将被放置在与文件相同的文件夹中。

答案1

@echo off
setlocal enabledelayedexpansion

for %%F in (*template*) do (
    set name=%%~nxF
    set name=!name:template=%date:~-4%%date:~-10,2%!
    rename "%%~fF" "!name!"
)

exit /B 0

答案2

Windows RENAME 对通配符的使用非常有限。它无法解决您当前的问题,但您可以查看Windows RENAME 命令如何解释通配符?

我编写了一个名为 REPL.BAT 的混合 JScript/批处理实用程序,它在 stdin 上执行正则表达式搜索和替换,并将结果写入 stdout。该实用程序是纯本机脚本,适用于从 XP 开始的任何 Windows 版本。无需下载 exe。

REPL.BAT 可在此处获得。完整文档嵌入在脚本中。

我继续惊讶于 REPL.BAT 的用处。它可以轻松解决您当前的问题。

假设 REPL.BAT 位于您当前的目录中,或者更好的是,位于 PATH 中的某个位置,则以下中等复杂的单行命令将从命令行运行:

for /f "tokens=1* delims=?" %A in ('dir /b *TEMPLATE*^|repl "(.*)TEMPLATE(.*)" "$&?$1201307$2" I') do @ren "%A" "%B"

或者作为更易于阅读的批处理脚本:

@echo off
for /f "tokens=1* delims=?" %%A in (
  'dir /b *TEMPLATE*^|repl "(.*)TEMPLATE(.*)" "$&?$1201307$2" I'
) do ren "%%A" "%%B"

我将匹配的文件名通过管道传输到 REPL.BAT,将每个名称修改为原始名称、?分隔符,然后是新名称。我选择?分隔符是因为它不能出现在文件名中。FOR /F 命令解析结果并为每个文件执行 REN 命令。

可以轻松修改上述内容,以递归方式重命名文件夹层次结构中的所有匹配文件:

@echo off
for /f "tokens=1* delims=?" %%A in (
  'dir /b /s *TEMPLATE*^|repl ".*\\(.*)TEMPLATE(.*)" "$&?$1201307$2" I'
) do ren "%%A" "%%B"

最后,动态地确定日期可能会很好,但由于地区差异,批量处理日期和时间通常非常麻烦。

另一个有用的混合 JScript/批处理实用程序名为 GETTIMESTAMP.BAT,它提供了强大的时间戳计算和格式化功能。它可以创建几乎任何所需格式的时间戳。可以指定日期/时间,也可以从系统时钟获取日期/时间。它提供日期和时间偏移,以及用于输入和输出的时区说明符。

GETTIMESTAMP.BAT 可在此处获得。。该实用程序位于文章底部。脚本中嵌入了大量文档。

有了 PATH 中的 GETTIMESTAMP.BAT,现在可以轻松扩展上述代码以动态建立日期字符串。这是递归文件夹版本:

@echo off
setlocal
call getTimestamp -f {yyyy}{mm} -r dt
for /f "tokens=1* delims=?" %%A in (
  'dir /b /s *TEMPLATE*^|repl ".*\\(.*)TEMPLATE(.*)" "$&?$1%dt%$2" I'
) do ren "%%A" "%%B"

答案3

如果您安装电源外壳你可以使用类似的东西:

get-childitem *.xlsx | foreach { rename-item $_ $_.Name.Replace("template", (Get-Date -format "yyyyMM")) }

这将重命名当前文件夹中的所有 XLSX 文件,并用当前年份和月份替换文件名中的“模板”一词。

相关内容