Следующий код пакетного файла можно использовать для переименования файлов, содержащих один или несколько !
в имени файла.
@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
ENDLOCAL
должен стоять после командыREN
. И используйте вместо этого:set /a num+=1
- person Squashman   schedule 15.07.2021