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

问题描述 投票:0回答:2

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

@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
windows batch-file cmd delayedvariableexpansion
2个回答
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

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 匹配的文件,则批处理文件很可能无法重命名某些文件
在执行批处理文件时的当前目录中。

阅读有关 使用命令重定向运算符的 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 /?

请阅读此答案,详细了解每次执行SETLOCALENDLOCAL时后台发生的情况。

© www.soinside.com 2019 - 2024. All rights reserved.