我正在尝试批量重命名包含以下名称模式的文件的文件夹中的文件:
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 文件,并用当前年份和月份替换文件名中的“模板”一词。