Добавить часть имени папки в начало имени файла

Добавить часть имени папки в начало имени файла

По сути, это продолжение ответа на вопрос, но с дополнительным условием.

Добавить имя папки в начало имени файла

У меня есть следующая структура каталогов:

Folder
  > SubFolder1xxxx
    > FileName1.abc
    > Filename2.abc
    > .............

  > SubFolder2xxxx
    > FileName11.abc
    > Filename12.abc
    > ..............

  > ..........

и т. д. Я хочу переименовать файлы внутри подпапок следующим образом:

SubFolder1_Filename1.abc
SubFolder1_Filename2.abc
SubFolder2_Filename11.abc
SubFolder2_Filename12.abc

т.е. добавьте часть имени папки в начало имени файла с разделителем " _". Структура каталогов должна остаться неизменной.

У меня есть ниже Скрипт


for /d %D in (*) do (
  for %F in ("%~D\*") do (
    for %P in ("%F\..") do (
      ren "%F" "%~nxP_%~nxF"
    )
  )
)

Проблема с приведенным выше скриптом в том, что он берет полное имя папки.

поэтому я попытался извлечь только часть имени файла, используя синтаксическую подстроку

 %variable:~num_chars_to_skip,num_chars_to_keep%

Поэтому я изменил код выше, но он выдал мне ошибку :(

for /d %D in (*) do (
      for %F in ("%~D\*") do (
        for %P in ("%F\..") do (
          ren "%F" "%~nxP:~0,10%_%~nxF"
        )
      )
    )

ошибка в том, что синтаксис substring не работает, он просто выводит его как строку. что-то вроде этого

SubFolder1xxxx:~0,10%

решение1

Пример пакета, который получает имя папки пакетного файла.

@echo off
set a=%~p0%
for /f "tokens=1,2,3,4,5,6,7,8,9 delims=\" %%a in ("%a%") do call :getlast %%a %%b %%c %%d %%e %%f %%g %%h %%i
goto :eof
:getlast
if "%1"=="" goto :eof
if "%2"=="" echo Current folder name is %1.
shift
goto :getlast

Текущие ограничения: не более 9 уровней подпапок (редактируйте, проанализируйте Slack, если необходимо), без пробелов в именах (редактируйте, добавьте кавычки, если необходимо).

Связанный контент