Esto es básicamente una continuación de la pregunta respondida pero con una condición adicional.
Agregar el nombre de la carpeta al comienzo del nombre del archivo
Tengo una estructura de directorio como la siguiente:
Folder
> SubFolder1xxxx
> FileName1.abc
> Filename2.abc
> .............
> SubFolder2xxxx
> FileName11.abc
> Filename12.abc
> ..............
> ..........
etc. Quiero cambiar el nombre de los archivos dentro de las subcarpetas como:
SubFolder1_Filename1.abc
SubFolder1_Filename2.abc
SubFolder2_Filename11.abc
SubFolder2_Filename12.abc
es decir, agregue parte del nombre de la carpeta al principio del nombre del archivo con el delimitador " _
". La estructura del directorio debe permanecer sin cambios.
Tengo el siguiente script
for /d %D in (*) do (
for %F in ("%~D\*") do (
for %P in ("%F\..") do (
ren "%F" "%~nxP_%~nxF"
)
)
)
El problema con el script anterior es que toma el nombre completo de la carpeta.
por lo tanto, intenté extraer solo una parte del nombre del archivo usando la subcadena de sintaxis
%variable:~num_chars_to_skip,num_chars_to_keep%
Entonces modifiqué el código anterior con él, pero me dio un error :(
for /d %D in (*) do (
for %F in ("%~D\*") do (
for %P in ("%F\..") do (
ren "%F" "%~nxP:~0,10%_%~nxF"
)
)
)
el error es básicamente que la subcadena de sintaxis no funciona, simplemente la imprime como una cadena. algo como esto
SubFolder1xxxx:~0,10%
Respuesta1
Lote de ejemplo que obtiene el nombre de la carpeta del archivo por lotes.
@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
Restricciones actuales: no más de 9 niveles de subcarpetas (editar, analizar la holgura si es necesario), sin espacios en los nombres (editar, agregar comillas si es necesario).