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

时间:2015-04-27 07:26:08

标签: batch-file batch-rename

@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

怎么可能发生?

2 个答案:

答案 0 :(得分:0)

不知何故,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=

答案 1 :(得分:0)

正如MC ND的评论中所指出的那样,https://stackoverflow.com/a/19705611/1012053可以获得对行为的解释。 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 /批处理),可以在XP以后的任何Windows机器上本机运行。

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

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