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).