Windows批处理添加文件名前缀,为什么会加两次?

7
为了在文件夹中的所有pdf文件前添加一个简单的“hello”前缀,我正在使用以下批处理文件:
FOR %%F IN (*.pdf) DO (RENAME "%%F" "hello%%F")

我将这个命令保存到一个名为“rename.bat”的文件中,并将其放置在需要重命名文件的文件夹中。然后我只需双击“rename.bat”即可。
这个方法几乎可以实现,但第一个文件会被添加两次前缀。
比如说,在文件夹中有A.pdf、B.pdf、C.pdf,它们会被转换为:
- hellohelloA.pdf - helloB.pdf - helloC.pdf
你知道批处理文件中出了什么问题吗?
我注意到当文件数量大于一个时,它总是会这样做。如果文件夹中只有一个文件,则它可以正常工作,但并不是很有用。

2
使用 DIR /B 命令并将名称列表导入到文本文件中,然后遍历该列表。目前你正在遍历该文件夹时对其中的文件进行更改。 - RGuggisberg
2个回答

10

/f可以避免重新捕获现有文件的问题:

FOR /f "delims=" %%F IN ('DIR /a-d /b *.pdf')  DO (RENAME "%%F" "hello%%F")

谢谢,这个有效!我读到了/F "delims=",我也看到你在调用命令'DIR /a-d /b *.pdf'。但是,你能解释一下为什么我的不起作用吗?为了测试,我甚至尝试在批处理文件中调用FOR %%F IN (*.pdf) DO (ECHO "%%F"),它只回显3个文件,所以你知道为什么使用RENAME代替ECHO时它会将第一个文件重命名两次吗? - Marco Demaio
RENAME 更改你正在处理的文件列表,echo 不会。 - Alex K.
1
FOR %%F ... 从磁盘目录逐一获取文件名,因此如果目录更改,则 FOR 获取的名称也可能更改,尽管这取决于几个因素。FOR /F %%F ... 在执行 DIR 命令后从生成的列表中获取文件名。请注意,/F 表单需要执行第二个 cmd.exe 的副本以执行 DIR 命令,并创建在结束时删除的临时文件。 - Aacini

0
@echo off
echo.
echo. Add Whatever Prefix...
echo.
echo. You Want To Add...
echo.
echo. To The Filename...
echo.
set /p variable=" > "
setlocal enabledelayedexpansion
for /f "delims=" %%a in (' dir /b /a-d *.pdf') do (
  set oldName=%%a
  Set newName=%variable%!oldName!
  Ren "!oldName!" "!newName!"
)
exit

这个很好用......试一下吧......从来没有双重前缀......


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接