Переименование файлов и распознавание пробелов в файле .bat - PullRequest
0 голосов
/ 27 мая 2018

Мне нужна небольшая помощь с .bat , который я использую для переименования файлов, содержащих несколько слов.Каждую неделю я загружаю несколько сотен файлов в папку, и использование чего-то вроде утилиты массового переименования занимает немного времени.

Под несколькими словами я подразумеваю, что один файл может выглядеть следующим образом:

The Hellblazer 021 (2018) (2 обложки) (Digital) (Сын Альтрон-Империи) .cbr

и я хотел бы иметь что-то, что изменит егоto:

Hellblazer 021 (2018) (digital) (Сын Ультрон-Империи) .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 голосов
/ 27 мая 2018

Справка по выводу 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 /?
...