重命名文件并识别.bat文件中的空格

时间:2018-05-27 12:00:57

标签: batch-file renaming

我需要帮助 .bat 我正在使用它来重命名包含多个字词的文件。我每周都会将几百个文件下载到一个文件夹中,并且使用批量重命名实用程序这样会花费一些时间。

多个单词的含义是一个文件可能如下所示:

Hellblazer 021(2018)(2封)(数码)(Ultron-Empire之子).cbr

我希望有一些东西可以改为:

Hellblazer 021(2018)(数字)(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个封面)来识别空格,因此完全从文件名中删除它。

有没有人有任何想法?

*编辑以澄清

1 个答案:

答案 0 :(得分:0)

在命令提示符窗口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 执行的命令块以(开头。 Windows命令处理器在执行命令 FOR 之前解析整个命令块时发现的下一个)被解释为命令块结束,除了)在双引号字符串内或转义为^以解释为文字字符而不是命令块的结尾。因此,如果不能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 /?