[Batch] Renombrado masivo de archivos ass con prefijo de la subcarpeta

Iniciado por ovichan, 5 Octubre 2012, 19:30 PM

0 Miembros y 1 Visitante están viendo este tema.

ovichan

Hola otra vez  :rolleyes:, en esta ocasion estoy intentado añadir a un archivo un prefijo en su nombre, que coincide con el nombre de la subcarpeta contenedora, y me explico con un ejemplo.

Los archivos en cuestion son del tipo: 7. Español.ass y 7. Japones.ass. Estan contenidos en subdirectorios con esta ruta: D:\DBZ\DBZ1_14\079. Como imaginareis los tres digitos ultimos son los que varian siempre, de manera que intento que quede los archivos renombrados asi: 079 - Español.ass. El renombrado deseo hacerlos sobre una copia de ese archivo.

He iniciado un codigo para comprobar si puedo almacenar en una variable cada prefijo pero no funciona:

for /R %%i in (*.ass) do (
set nom=%%i
echo %%nom:~15,3%%
)


Si unicamente hago echo de la variable i, sale la ruta de cada archivo de forma correcta. Imagino que tenga que ver con la recursividad pero no se como solucionarlo con este mismo codigo. Imagino que habra otra manera mas correcta pero no me enteraré de lo que estoy haciendo.

De forma teorica el codigo general seria algo asi:

for /R %%i in (*.ass) do (
set nom="%%i"

set prefix=%nom:~15,3%

set lex=%nom:~22,14%

set nombre=Capitulo %prefix% - %lex%

set ruta=%nom:~0,15%

copy "%%i" "%ruta%%nombre%"

)


No funciona ni a tiros pero estructuralmente esto es lo que deseo hacer.


RevangelyonX

Ahora no lo puedo probar aunque diria que el substring no te funciona porque no tienes el set enabled expansion local puesto.
Elektro Hacker supongo que lo confirmará. ;)

Salu2
Just Linux
OSCP certified

Eleкtro

#2
Cita de: RevangelyonX en  5 Octubre 2012, 21:12 PMElektro Hacker supongo que lo confirmará. ;)

Exacto xD

Como bien te ha dicho el amigo RevangelionX, no te funciona porque no estás expandiendo la variable para poder usarla en el FOR.

Pero aparte de eso, el parámetro "/R" del for es muy mala idea usarlo en casos como este, el for procesa los archivos ASS de la carpeta (Uno por uno), pero en el momento que uno de esos archivos es "prefijado" el for puede procesar ese nuevo archivo si el nuevo nombre del archivo está entre los que el For todavía no a procesado por el orden alfabético...
si tenemos el archivo "A" y "B", y el archivo "A" es renombrado a "C" antes de procesar el archivo "B" , el For procesará también el archivo "C" porque el FOR aún no ha llegado a esa letra alfabéticamente hablando, no se si me entiendes, asi que se volverá a "re-prefixear" ese archivo.., me ha pasado muchisimas veces en ocasiones parecidas...


Código (dos) [Seleccionar]
@Echo OFF
Setlocal enabledelayedexpansion

for /F "Tokens=*" %%i in ('Dir /B /S "*.ass"') do (

set "nom=%%i"

set prefix=!nom:~15,3!
set lex=!nom:~22,14!
set nombre=Capitulo !prefix! - !lex!
set ruta=!nom:~0,1!

copy "%%i" "!ruta!!nombre!"
)
pause&exit


Saludos








ovichan

Ok, no almacenan en um stack los archivos que debe procesar, lo hace de manera secuencial. Esto lo pillo,, pero no se pq utilizas tokens=*. Y el hecho de usar signos exclamativos tampoco lo entiendo. Lo del for con el dir combinado lo he visto usar para los instaladores independientes de updates de windows, precisamente para listar los archivos a procesar.

Gracias.

Eleкtro

#4
Cita de: ovichan en  6 Octubre 2012, 00:18 AMno se pq utilizas tokens=*
El for /F por defecto tiene habilitado el delimitador de la cadena, y como ya sabrás, los tokens se delimitan al encontrar un (espacio), como un argumento, pues eso, le indico que no delimite/corte agrupe los tokens en uno solo, porque los nombres de tus "ASS" contienen espacios.

Comprueba lo que obtienes sin definir los tokens...

Cita de: ovichan en  6 Octubre 2012, 00:18 AMel hecho de usar signos exclamativos tampoco lo entiendo.
CitarEnableDelayedExpansion

Delayed Expansion will cause variables to be expanded at execution time rather than at parse time, this option is turned on with the SETLOCAL command.
When delayed expansion is in effect variables may be referenced using !variable_name!
http://ss64.com/nt/delayedexpansion.html








ovichan

Buenas, ya he comprobado todo pero he tenido que adaptarlo ya que en los 9 primeros dvds, la ruta cambia a D:\DBZ\DBZ1_1\001. Para eso he utilizado un if con este codigo de prueba y devuelve los valores correctos:

set "nom=H:\DBZ\DBZ1_11\061\7. Japones.ass"

if %nom:~12,2% lss 10 (

echo !nom:~14,3!

set prefix=!nom:~14,3!

echo !nom:~21,14!

set lex=!nom:~21,14!

echo Capitulo !prefix! - !lex!

set ruta=!nom:~0,14!

echo !ruta!

) else (

echo !nom:~15,3!

set prefix=!nom:~15,3!

echo !nom:~22,14!

set lex=!nom:~22,14!

echo Capitulo !prefix! - !lex!

set ruta=!nom:~0,15!

echo !ruta!
)


Al insertarlo en el for, me da un error al crear los archivos, los crea mal y separa los nombre, etc... no se si sera por usar la ñ.

@echo off
setlocal enabledelayedexpansion
Title Codificacion masiva


for /f "tokens=*" %%i in ('dir /b /s "*.ass"') do (

set "nom=%%i"
set "ruta=D:\DBZ\Subtitulos mod\"
set /a num=!nom:~12,2! 2>nul

if !num! lss 10 (

set prefix=!nom:~14,3!

set lex=!nom:~21,14!

set nombre=Capitulo !prefix! - !lex!
echo !prefix!
echo !lex!

rem copy "%%i" "!ruta!!nombre!"

) else (

set prefix=!nom:~15,3!

set lex=!nom:~22,14!

set nombre=Capitulo !prefix! - !lex!
echo !prefix!
echo !lex!
rem copy "%%i" "!ruta!!nombre!"
)
)
pause&exit



Eleкtro

#6
Sinceramente, es imposible saber que variable "coje" mal el rango de caracteres sin que aportes los archivos necesarios con el nombre exacto de las rutas y archivo para poder recrear la situación en otro pc, porque la sintaxis en general está bien.

EDITO: Prueba poniendo:
Código (dos) [Seleccionar]
Echo copy "%%i" "!ruta!!nombre!"
para ver si está todo correcto...

saludos








ovichan

Fallo mio, se me fue la olla y probando no actualice la ruta devlos archivos. Gracias de nuevo.