我正在尝试以增量方式重命名目录中的剧集,但某些剧集中有感叹号。它将跳过这些文件。我尝试过延迟扩展,但没有成功。
@echo off
setlocal DisableDelayedExpansion
set /a num=0
for %%a in (*.mkv) do (
set filename=%%a
setlocal EnableDelayedExpansion
ren "!filename!" "Soul Eater Episode 0!num!.mkv"
set /a num=!num!+1
)
pause
endlocal
试试这个:
@echo off
setlocal EnableDelayedExpansion
set /a num=0
for %%a in (*.mkv) do (
set filename=%%a
ren "!filename!" "Soul Eater Episode 0!num!.mkv"
set /a num=!num!+1
)
endlocal
pause
以下批处理文件代码可用于重命名文件名中包含一个或多个
!
的文件。
@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "num=0"
for /F "eol=| delims=" %%I in ('dir *.mkv /A-D /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /L /V /C:"Soul Eater Episode"') do (
set "filename=%%I"
setlocal EnableDelayedExpansion
ren "!filename!" "Soul Eater Episode 0!num!.mkv"
endlocal
set /A num+=1
)
pause
endlocal
无需使用算术表达式来定义具有值
num
的环境变量 0
。
强烈建议使用
*.mkv
等通配符模式对目录中的文件名列表运行重命名,以首先获取加载到 Windows 命令处理器内存中的文件名列表,然后在完成后重命名一个文件。通过此代码使用 for /F
循环。否则,文件重命名的结果是不可预测的,因为取决于文件系统(NTFS、FAT32、exFAT)和通配符模式匹配的文件的当前名称。
附加的 FINDSTR 用于过滤掉所有以字符串
Soul Eater Episode
开头且不区分大小写的文件名,尽管如果已经存在文件名与 Soul Eater Episode 0*.mkv
匹配的文件,则批处理文件很可能无法重命名某些文件
在执行批处理文件时的当前目录中。
阅读有关 使用命令重定向运算符的 Microsoft 文档,了解
2>nul
和 |
的说明。重定向运算符 >
和 |
必须在 FOR命令行上使用脱字符号
^
进行转义,以便在 Windows 命令解释器在执行执行嵌入命令的命令 FOR 之前处理此命令行时将其解释为文字字符与 dir
和 findstr
一致,使用在后台启动的单独命令进程,并使用 %ComSpec% /c
并附加指定的命令行作为附加参数。
文件名首先由 DIR 指定为输出,并通过 FINDSTR 过滤到环境变量
filename
,并禁用延迟扩展,否则在启用延迟扩展时对此命令行进行双重处理将导致在中解释 !
分配给循环变量I
的文件名作为延迟扩展环境变量引用的开始/结束。
然后启用延迟扩展,以便能够通过使用延迟扩展引用环境变量
num
以及分配给环境变量filename
的文件名来进行重命名。
在使用算术表达式之前再次禁用下一个延迟扩展,使用首选语法将环境变量的值增加一,该值始终独立于禁用或启用延迟扩展而工作。
要了解所使用的命令及其工作原理,请打开命令提示符窗口,执行以下命令,并完整、仔细地阅读每个命令显示的帮助页面。
dir /?
echo /?
endlocal /?
findstr /?
for /?
pause /?
ren /?
set /?
setlocal /?
请阅读此答案,详细了解每次执行SETLOCAL和ENDLOCAL时后台发生的情况。