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.
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
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...
@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
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.
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
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
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:
Echo copy "%%i" "!ruta!!nombre!"
para ver si está todo correcto...
saludos
Fallo mio, se me fue la olla y probando no actualice la ruta devlos archivos. Gracias de nuevo.