如何使用批处理脚本在文件名前插入文本

How to insert a text in front of the filenames using a batch script

@echo off 
for %%a in (*.xhtml) do (

ren "%%~fa" "epub_%%~nxa"
)

我正在使用向所有文件名插入文本 ("epub_") 的代码。

文件名为

00_Cover_Page.xhtml
01_Halftitle.xhtml
02_Title.xhtml
03_Copyright.xhtml
04_Dedication.xhtml
05_Preface.xhtml
06_Contents.xhtml

重命名很好,除了“00_Cover_Page.xhtml

epub_epub_00_Cover_Page.xhtml("epub_" 仅在文件名中插入两次)

epub_01_Halftitle.xhtml
epub_02_Title.xhtml
epub_03_Copyright.xhtml
epub_04_Dedication.xhtml
epub_05_Preface.xhtml
epub_06_Contents.xhtml

怎么会这样?

FOR 循环以某种方式获取已重命名的文件。您可以(至少)通过两种方式避免这种情况:

  1. 尽可能过滤原始文件名:

    for %A in (0*.xhtml) do @ren "%~nxA" "epub_%~nxA"

  2. 预先创建一个文件名列表并在循环中使用它:

    set tmpfile=files%RANDOM%.tmp
    dir /b *.xhtml > %tmpfile%
    for /f %A in (%tmpfile%) do @ren "%~nxA" "epub_%~nxA"
    del %tmpfile%
    set tmpfile=

正如 MC ND 的评论中所指出的,可在 上找到对该行为的解释。 FOR 循环仅缓冲目录的一部分,当它返回磁盘读取其他文件条目时,它可以拾取已重命名的文件。

jeb's answer on that same question 解释了如何通过使用 FOR /F 循环处理 DIR /B 命令来避免此问题 - DIR /B 命令的输出在迭代开始之前被完整捕获。

@echo off
for /f "eol=: delims=" %%F in ('dir /b /a-d *.xhtml') do ren "%%F" "epub_%%~nxa"

另一种方法是使用我的 JREN.BAT regular expression renaming utility。 JREN.BAT 是纯脚本(混合 JScript/batch),可以在任何 Windows XP 以后的机器上本地运行。

jren "^" "epub_" /fm *.xhtml

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