微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决使用特殊字符批量重命名文件

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

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

阅读有关 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 时后台会发生什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?