Adicione parte do nome da pasta ao início do nome do arquivo

Adicione parte do nome da pasta ao início do nome do arquivo

Esta é basicamente uma continuação da pergunta respondida, mas com condições adicionais

Adicione o nome da pasta ao início do nome do arquivo

Eu tenho uma estrutura de diretórios conforme abaixo:

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

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

  > ..........

etc. Quero renomear os arquivos dentro das subpastas como:

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

ou seja, adicione parte do nome da pasta no início do nome do arquivo com o delimitador " _". A estrutura de diretórios deve permanecer inalterada.

Eu tenho abaixo do Script


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

O problema com o script acima é que ele usa o nome completo da pasta

portanto, tentei extrair apenas parte do nome do arquivo usando substring de sintaxe

 %variable:~num_chars_to_skip,num_chars_to_keep%

Então eu modifiquei o código acima com ele, mas me deu um erro :(

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

o erro é basicamente que a substring de sintaxe não funciona, apenas imprime como uma string. algo assim

SubFolder1xxxx:~0,10%

Responder1

Lote de exemplo que obtém o nome da pasta do arquivo em lote.

@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

Restrições atuais: não mais que 9 níveis de subpastas (editar, analisar folga se necessário), sem espaços nos nomes (editar, adicionar aspas se necessário).

informação relacionada