Пакетный файл - переименовывать файлы на основе родительского имени и имени (под)папки(ей)

Вот код:

for /r %%a in (*.jpg, *.png, *.bmp, *.exe) do (
  for /d %%d in (%CD%) do (
    set newname=%%~nd%~x1
    ren "%%~a" "!newname!%%~Xa"
    echo media file in %%~fa renamed to "!newname!%%~Xa"
  )
)

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

Пример того, что происходит:

C:\parent\name.jpg renamed to C:\parent\parent.jpg
C:\parent\child\name.jpg renamed to C:\parent\child\parent.jpg
C:\parent\child1\child2\name.jpg renamed to C:\parent\child1\child2\parent.jpg

Я нуждаюсь:

C:\parent\1.jpg rename to C:\parent\parent.jpg
C:\parent\child\1.jpg rename to C:\parent\child\child.jpg
C:\parent\child1\child2\name.jpg renamed to C:\parent\child1\child2\child2.jpg

Любая помощь?


person fat_mike    schedule 12.10.2013    source источник


Ответы (1)


Это отобразит команды ren на экране.
Удалите ключевое слово echo, чтобы оно действительно выполняло переименования.

@echo off
for /r %%a in (*.jpg *.png *.bmp *.exe) do for %%b in ("%%~dpa\.") do echo ren "%%~a" "%%~nxb%%~xa"
pause

Первая команда %%a FOR рекурсивно возвращает каждую спецификацию файла, а формат каждого файла следующий:
c:\path\to\folder\filename.ext

Второму %%b FOR присваивается часть c:\path\to\folder, а \. добавляется в конец, что делает его c:\path\to\folder\., который разрешается в текущий каталог to и интерпретирует folder как имя файла.

Таким образом, %%~nxb возвращает имя файла и расширение %%b, которое в данном случае равно folder и используется в команде переименования. %%~xa возвращает расширение .extension строки %%a.

Я надеюсь, что это довольно ясно, наряду с изучением кода.

Последняя страница справки FOR /? описывает метапеременные.

person foxidrive    schedule 13.10.2013
comment
Ну, это отлично работало в строке кода. Хотите немного объяснить команды? - person fat_mike; 13.10.2013
comment
Большое тебе спасибо. Это очень полезно. - person fat_mike; 13.10.2013
comment
Привет, действительно все работает хорошо, вместо переименования есть ли способ добавить имя папки ПЕРЕД именем файла? Спасибо - person Arthor; 08.04.2020