@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
怎么可能发生?
答案 0 :(得分:0)
不知何故,FOR
循环选择已重命名的文件。您可以(至少)以两种方式避免这种情况:
如果可能,请对原始文件名进行过滤:
for %A in (0*.xhtml) do @ren "%~nxA" "epub_%~nxA"
事先创建一个文件名列表并在循环中使用它:
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。