我正在使用一个批处理文件将文件夹中的所有文件重命名为一个编号列表。我使用的代码如下:
set /a Index=1
setlocal enabledelayedexpansion
for /f "tokens=*" %%f in ('dir /b') do (
echo %%f
echo !Index!
rename "%%f" "!Index!.*"
set /a Index+=1
pause
)
批处理文件的结果为
G:\Directory A> (
echo
03.jpg
echo 1
rename "
03.jpg" "1.*"
set /a Index+=1
pause
)
03.jpg
1
The filename, directory name, or volume label syntax is incorrect.
Press any key to continue . . .
G:\Directory A> (
echo 04.jpg
echo 1
rename "04.jpg" "1.*"
set /a Index+=1
pause
)
04.jpg
1
第一个结果总是在文件名的开头包含一个换行符,这会导致RENAME命令失败。有人能告诉我我的代码有什么问题吗?
更新
在Windows注册表中设置了以下自动运行代码:
[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"Autorun"="@chcp 65001>nul & prompt $d$s$s$t$_$p$g & cls"
2条答案
按热度按时间rxztt3cl1#
在我的批处理文件挖掘了一点,我认识到这是一个问题的自动运行选项,我已经设置了多年前在注册表,看起来像这样:
显然,CLS命令导致了奇怪的换行符的发生。在从Autorun中删除CLS部分后,批处理文件按预期的方式工作。
p8ekf7hl2#
在self-answer中描述的发现非常有趣,尽管非常讨厌!
自动运行代码包含
cls
command,它向控制台发送一个换页字符(FF,代码0x0C
),告诉它清除屏幕(可以通过在控制台中运行cls > con
来显示该字符)。当在
for /F
loop中执行cls
时,捕获FF:for /F %F in ('cls') do @echo/%F
将显示该字符。for /F
循环启动新的cmd.exe
示例以执行给定的命令行;这是通过将cmd /C
置于命令行之前来完成的。设置了自动运行命令后,它们将在
for /F
循环中执行(由于不幸缺少/D
选项,这将阻止它们运行)。问题中的auto-run命令行涉及到
cls
,因此for /F %F in ('rem') do @echo/%F
捕获了一个FF,尽管实际的命令rem
没有返回任何内容。有一些方法可以隐藏FF字符(请注意,下列程式码范例是要放在batch-file中,而不是输入主控台):
1.在所需的命令行之前添加
echo/&
,以便将换行符附加到可能的FF,从而在开头增加一行,并跳过该行for /F
:1.首先检索一个FF,并将其定义为
for /F
的eol
(行尾)字符,然后再次像前面一样,在所需的命令行前面加上echo/&
: