使用特殊字符批量重命名文件

时间:2021-07-15 18:12:14

标签: windows batch-file cmd delayedvariableexpansion

我正在尝试以增量方式重命名目录中的剧集,但在某些剧集中有感叹号。它会跳过这些文件。我尝试过延迟扩展,但没有成功。

@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

2 个答案:

答案 0 :(得分:0)

试试这个:

@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

答案 1 :(得分:0)

以下批处理文件代码可用于重命名文件名中包含一个或多个 ! 的文件。

@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 匹配的文件。

阅读有关 Using command redirection operators 的 Microsoft 文档以了解 2>nul|。重定向运算符 >| 必须在 FOR 命令行上用脱字符符 ^ 转义,以便在 Windows 命令解释器处理此命令行时被解释为文字字符在执行命令 FOR 之前,该命令执行带有 dirfindstr 的嵌入式命令行,在后台启动的单独命令进程中,%ComSpec% /c 和指定的命令行附加为附加参数。

文件名首先由 DIR 指定为输出,由 FINDSTR 过滤到环境变量 filename 并禁用延迟扩展,否则将对此进行双重处理启用延迟扩展的命令行会导致将分配给循环变量 ! 的文件名中的 I 解释为延迟扩展环境变量引用的开始/结束。

然后启用延迟扩展,以便能够使用延迟扩展引用环境变量 num 进行重命名,当然还有分配给环境变量 filename 的文件名。

在使用算术表达式之前再次禁用下一次延迟扩展,使用首选语法将环境变量的值递增 1,这始终独立于禁用或启用的延迟扩展。

要了解使用的命令及其工作原理,请打开 command prompt 窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。

  • dir /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • pause /?
  • ren /?
  • set /?
  • setlocal /?

请阅读this answer,详细了解每次执行 SETLOCALENDLOCAL 时后台会发生什么。