【问题标题】:Renaming files and recognising spaces in a .bat file重命名文件和识别 .bat 文件中的空格
【发布时间】:2018-05-27 23:51:34
【问题描述】:

我需要一些关于 .bat 的帮助,我用来重命名包含 多个 字词的文件。我每周都会将数百个下载到一个文件夹中,使用批量重命名实用程序之类的工具会花费一些时间。

我所说的多个词的意思是一个文件可能看起来像:

The Hellblazer 021 (2018)(2 个封面)(数字版)(奥创帝国之子).cbr

我想要一些东西来改变它:

The Hellblazer 021 (2018) (digital) (Son of Ultron-Empire).cbr

我目前使用的句柄将某些内容更改为小写就可以了。

@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
SET old=Digital
SET new=digital
for /f "tokens=*" %%f in ('dir /b *.*') do (
  SET newname=%%f
  SET newname=!newname:%old%=%new%!
  move "%%f" "!newname!"
)

我可以在下面添加另一部分来改变不同的词来表达我的心意。问题是,我无法让它识别带有 (2 个封面) 之类的空格,因此无法将其完全从文件名中删除。

有人有什么想法吗?

*为澄清而编辑

【问题讨论】:

  • 文件名通常采用name.extension 的形式,您能否提供更准确的输入文件名示例及其匹配所需的输出文件名。这应该由editing your question 完成,不在此评论区回复。
  • 如果必须在 Windows 上,您可以随时探索使用 powershell 或 vbscript 获得的额外功能和功能
  • set 变量替换有点奇怪:要替换的字符串区分大小写in。因此,尽管看起来很奇怪,但您可以根据需要执行以下操作:SET newname=!newname:%new%=%new%!。所以它也会将DIGITALDiGiTaL 更改为digital(只是一个旁注,让你为惊喜做好准备)
  • 您根据什么标准确定要从文件名中删除的部分?总是(2 covers)

标签: batch-file renaming


【解决方案1】:

cmd.exe 在命令提示符窗口中运行时输出的帮助cmd /? 在最后一页的最后一段解释了包含空格或其中一个字符 &()[]{}^=;!'+,`~ 的文件名必须用双引号引起来。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do (
    set "NewName=%%I"
    set "NewName=!NewName:Digital=digital!"
    set "NewName=!NewName: (2 covers)=!"
    move "%%I" "!NewName!"
)
endlocal

另见How to set environment variables with spaces?

在带有 SET 的命令行中,字符串 set 是参数 0,NewName=... 是参数 1。整个参数字符串必须用双引号括起来,尤其是在包含空格或其中之一的情况下这些字符&()[]{}^=;!'+,`~<|>

嗯,命令 SET 有一个非常特殊的参数字符串解析,即使将带有空格和括号的字符串值分配给环境变量,它也经常可以省略双引号。但是 FOR 执行的命令块以( 开头。在执行命令 FOR 之前,Windows 命令处理器在解析整个命令块时发现的下一个) 被解释为命令块的结尾,除非) 在双引号字符串内或用@ 转义987654333@ 被解释为文字字符而不是命令块的结尾。因此,如果不能 100% 保证参数字符串不包含命令行关键字符,强烈建议始终用双引号将参数字符串括起来。

另外注意:由于启用了延迟的环境变量扩展,上述批处理文件无法正确处理包含一个或多个! 的文件名。

解决方案是通过使用子程序来避免使用延迟扩展。

@echo off
for /F "eol=| delims=" %%I in ('dir * /A-D-H /B 2^>nul') do call :RenameFile "%%I"
goto :EOF

:RenameFile
set "NewName=%~1"
set "NewName=%NewName:Digital=digital%"
set "NewName=%NewName: (2 covers)=%"
move %1 "%NewName%"
goto :EOF

另见Where does GOTO :EOF return to?

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

  • call /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • move /?
  • set /?
  • setlocal /?

【讨论】:

  • 效果很好!太感谢了。我知道它以某种方式涉及引号,但我不明白将它们放在那里的语法。
猜你喜欢
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2021-07-21
  • 2017-05-02
  • 2014-07-05
  • 1970-01-01
相关资源
最近更新 更多