Справка по выводу 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
См. Также Как установить переменные среды с пробелами?
В командной строке с 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
См. Также Куда возвращается GOTO: EOF?
Чтобы понять используемые команды и их работу, откройте окно командной строки, выполните там следующие команды и полностью прочитайте все страницы справки.очень тщательно отображается для каждой команды.
call /?
dir /?
echo /?
endlocal /?
for /?
goto /?
move /?
set /?
setlocal /?