Пакетное переименование файлов пошагово со специальными символами

Я пытаюсь постепенно переименовать эпизоды в директории, но в некоторых эпизодах есть восклицательные знаки. Он пропустит эти файлы. Я пытался сделать отложенное расширение, но это не сработало.

@echo off
setlocal DisableDelayedExpansion

  set /a num=0
  for %%a in (*.mkv) do (
  set filename=%%a
  setlocal EnableDelayedExpansion
  ren "!filename!" "Soul Eater Episode 0!num!.mkv"
  set /a num=!num!+1
 )
pause
endlocal

person Justin    schedule 15.07.2021    source источник
comment
ENDLOCAL должен стоять после команды REN. И используйте вместо этого: set /a num+=1   -  person Squashman    schedule 15.07.2021


Ответы (2)


Попробуй это:

@echo off
setlocal EnableDelayedExpansion
  set /a num=0
  for %%a in (*.mkv) do (
  set filename=%%a
  ren "!filename!" "Soul Eater Episode 0!num!.mkv"
  set /a num=!num!+1
 )
endlocal
pause
person CODERS BLADE TECH TEAM    schedule 16.07.2021
comment
Спрашивающий написал в первом предложении: но в некоторых эпизодах есть восклицательные знаки. Этот код не может обрабатывать имена файлов с ! из-за того, что отложенное расширение включено уже в начале пакетного файла, и по этой причине строка set filename=%%a приводит к интерпретации ! в имени файла, присвоенном переменной цикла a, как ссылку на отложенную расширенную переменную среды, то есть имя файла с ! присваивается переменной среды filename с измененной строкой. Таким образом, этот код вообще не работает для особого случая использования вопрошающего. - person Mofi; 16.07.2021

Следующий код пакетного файла можно использовать для переименования файлов, содержащих один или несколько ! в имени файла.

@echo off
setlocal EnableExtensions DisableDelayedExpansion
set "num=0"
for /F "eol=| delims=" %%I in ('dir *.mkv /A-D /B /ON 2^>nul ^| %SystemRoot%\System32\findstr.exe /B /I /L /V /C:"Soul Eater Episode"') do (
    set "filename=%%I"
    setlocal EnableDelayedExpansion
    ren "!filename!" "Soul Eater Episode 0!num!.mkv"
    endlocal
    set /A num+=1
)
pause
endlocal

Нет необходимости использовать арифметическое выражение для определения переменной среды num со значением 0.

Очень желательно при выполнении переименований в списке имен файлов в каталоге с использованием шаблона подстановочных знаков, такого как *.mkv, чтобы сначала получить список имен файлов, загруженных в память командного процессора Windows, а затем переименовывать один файл за другим, как это делается с помощью этого кода используя цикл for /F. В противном случае результат переименования файлов непредсказуем, так как зависит от файловой системы (NTFS, FAT32, exFAT) и текущих имен файлов, совпадающих с подстановочным знаком.

Дополнительный FINDSTR используется для фильтрации всех имен файлов, начинающихся без учета регистра со строки Soul Eater Episode, хотя пакетный файл, скорее всего, не сможет переименовать некоторые файлы, если уже есть файлы с именем файла, совпадающим с Soul Eater Episode 0*.mkv в текущем каталоге при выполнении пакетного файла.

Прочтите документацию Microsoft о Использование операторов перенаправления команд для объяснения 2>nul и |. Операторы перенаправления > и | должны быть экранированы символом вставки ^ в командной строке FOR, чтобы они интерпретировались как буквальные символы, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR, которая выполняет встроенную командную строку с dir и findstr в отдельном командном процессе, запущенном в фоновом режиме с %ComSpec% /c, и указанная командная строка добавляется в качестве дополнительных аргументов.

Имя файла сначала назначается в качестве вывода DIR, отфильтрованного с помощью FINDSTR, в переменную среды filename с отключенным отложенным расширением, поскольку в противном случае двойная обработка этой командной строки при включенном отложенном расширении будет приводит к интерпретации ! в имени файла, присвоенного переменной цикла I, как начало/конец отложенной расширенной ссылки на переменную среды.

Затем включается отложенное расширение, чтобы иметь возможность выполнять переименование со ссылкой на переменную среды num с использованием отложенного расширения и, конечно, также имя файла, присвоенное переменной среды filename.

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

Чтобы понять, какие команды используются и как они работают, откройте окно командной строки, выполните в нем следующие команды , и очень внимательно прочитайте все страницы справки, отображаемые для каждой команды.

  • dir /?
  • echo /?
  • endlocal /?
  • findstr /?
  • for /?
  • pause /?
  • ren /?
  • set /?
  • setlocal /?

Прочтите этот ответ с подробным описанием того, что происходит в фоновом режиме при каждом выполнении SETLOCAL и КОНЕЦЛОКАЛЬНО.

person Mofi    schedule 16.07.2021
comment
Это сработало! Спасибо! - person Justin; 17.07.2021