重命名文件并识别 .bat 文件中的空格
Renaming files and recognising spaces in a .bat file
我需要一些关于 .bat 的帮助,我正在使用它来重命名包含 多个 单词的文件。我每周都会将数百个文件下载到一个文件夹中,使用批量重命名实用程序之类的东西会花费一些时间。
我所说的多个词的意思是一个文件可能如下所示:
The Hellblazer 021 (2018) (2 covers) (Digital) (Son of Ultron-Empire).cbr
我想要一些可以将其更改为:
地狱开拓者 021 (2018)(数字版)(奥创帝国之子).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 covers) 之类的空格,因此无法将其从文件名中完全删除。
有没有人有什么想法?
*编辑澄清
cmd.exe
在命令提示符 运行 上输出的帮助 window cmd /?
在最后一页的最后一段解释了包含 space 的文件名或这些字符之一 &()[]{}^=;!'+,`~
必须用双引号引起来。
@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
另见
在带有 SET 的命令行上,字符串 set
是参数 0,NewName=...
是参数 1。整个参数字符串必须用双精度括起来引号,尤其是包含 space 或这些字符之一 &()[]{}^=;!'+,`~<|>
.
嗯,命令 SET 有一个非常特殊的参数字符串解析,这使得即使在使用 spaces 分配字符串值时也可以省略双引号和括号到环境变量。但是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
另见
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
dir /?
echo /?
endlocal /?
for /?
goto /?
move /?
set /?
setlocal /?
我需要一些关于 .bat 的帮助,我正在使用它来重命名包含 多个 单词的文件。我每周都会将数百个文件下载到一个文件夹中,使用批量重命名实用程序之类的东西会花费一些时间。
我所说的多个词的意思是一个文件可能如下所示:
The Hellblazer 021 (2018) (2 covers) (Digital) (Son of Ultron-Empire).cbr
我想要一些可以将其更改为:
地狱开拓者 021 (2018)(数字版)(奥创帝国之子).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 covers) 之类的空格,因此无法将其从文件名中完全删除。
有没有人有什么想法?
*编辑澄清
cmd.exe
在命令提示符 运行 上输出的帮助 window cmd /?
在最后一页的最后一段解释了包含 space 的文件名或这些字符之一 &()[]{}^=;!'+,`~
必须用双引号引起来。
@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
另见
在带有 SET 的命令行上,字符串 set
是参数 0,NewName=...
是参数 1。整个参数字符串必须用双精度括起来引号,尤其是包含 space 或这些字符之一 &()[]{}^=;!'+,`~<|>
.
嗯,命令 SET 有一个非常特殊的参数字符串解析,这使得即使在使用 spaces 分配字符串值时也可以省略双引号和括号到环境变量。但是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
另见
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
call /?
dir /?
echo /?
endlocal /?
for /?
goto /?
move /?
set /?
setlocal /?