我需要帮助 .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个封面)来识别空格,因此完全从文件名中删除它。
有没有人有任何想法?
*编辑以澄清
答案 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 /?