如何使用批处理脚本在文件名前插入文本
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
循环以某种方式获取已重命名的文件。您可以(至少)通过两种方式避免这种情况:
尽可能过滤原始文件名:
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=
正如 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。
@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
循环以某种方式获取已重命名的文件。您可以(至少)通过两种方式避免这种情况:
尽可能过滤原始文件名:
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=
正如 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。