
По сути, это продолжение ответа на вопрос, но с дополнительным условием.
Добавить имя папки в начало имени файла
У меня есть следующая структура каталогов:
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, если необходимо), без пробелов в именах (редактируйте, добавьте кавычки, если необходимо).