Mover a otra carpeta y usar una archivo por orden de menor a mayor con BATCH

Iniciado por Dsalomon, 14 Enero 2015, 07:42 AM

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

Dsalomon

Buena noche amigos, estoy aquí nuevamente para hacer otra de esas solicitudes de ayuda en un batch, sino extrañas, pero no comunes, esta es la situación,

Tengo una colección de archivos de video dentro de una carpeta llamada SERIE1
Los archivos dentro de SERIE1 están nombrados con tres ceros 000 para para mantener un orden de los mismos y no se enreden los que tengan 1 con los 11, o sea mantengan la numeración que corresponde a un correlativo algo asi:

SERIE1:
Capitulo_001
Capitulo_002
Capitulo_003
Capitulo_004
Capitulo_005
Capitulo_006
Capitulo_007
Capitulo_008
Capitulo_009
Capitulo_010
Capitulo_011
Capitulo_012
Etcétera....

Al dar doble click al batch: quiero que el archivo: Capitulo_001 se mueva a una carpeta nueva llamada SERIE1_EMITIDOS, y después se añada a la lista de reproducción de winamp para parle Reproducir o play.
Y así entonces el siguiente archivo la próxima vez al darle al batch seria Capitulo_002 y play en winamp,
Y consecutivamente, cada vez que se corra el comando en el batch, hasta que la carpeta SERIE1 quede vaciá y la carpeta SERIE1_EMITIDOS guarde intactos todos los capítulos, para tal efecto googlenado halle esto más lo mezcle con otros códigos para ver si así funciona o me pueden guiar a corregirlo

Código (dos) [Seleccionar]
rem @echo off

Echo #EXTM3U>"%Temp%\capitulo_hoy.tmp"

for /f "tokens=*" %%a in
('dir /b /on E:\series\SERIES1\*.mkv$*') do
(
move E:\series\SERIES1\"%%a" E:\series\SERIES1

E:\series\SERIES1\"%%a"
pause
)

do (Echo  %%a>>"%Temp%\ capitulo_hoy.tmp")


Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Temp%\Lista Winamp.m3u"

Exit



muchas gracias por su tiempo, mientras tanto haré mis pruebas.

Black Dragon

Pues ni idea de si funciona el código siguiente al que he llegado. Estoy bajo Linux y no tengo ninguna forma de probarlo en windows. Probablemente tenga errores de comillado u otras cosas pero la estructura debería ser algo como lo que pongo al final.

La idea es mantener un registro en un archivo separado que guarda el número de capitulo por el vamos. He dado por sentando que no hay capítulos que se saltan números, si existiesen deberías agregar algún tipo de comprobación.

Asi que si tiene errores deberás encontrarlos y arreglarlos tu mismo.

Un saludo.

Código (dos) [Seleccionar]

@echo off

cd /D E:\series\SERIES1

IF NOT EXIST Actual.txt (
echo "Iniciando... Creando archivo de Posicion."
echo "0" >Actual.txt
exit
) ELSE (
rem Creamos el archivo Actual.txt en el que contiene el capitulo actual
SET /P actual_n= < Actual.txt
)
rem Recoge el valor numerico le pone 5 ceros y recoge los ultimos 3 dijitos
rem Asi siempre tenemos el mismo numero de digitos con ceros al inicio.
set actual=00000%actual_n%
set actual=%actual:~-3%

rem Si no existe la carpeta de emitidas la creamos
IF NOT EXIST SERIES1_EMITIDAS (
echo "Creando carpeta de emitidas"
md SERIES1_EMITIDAS
)
rem Movemos el capitulo actual a la carpeta de emitidos
move Capitulo_%actual% SERIES1_EEMITIDAS\
cd SERIES1_EEMITIDAS

rem Ejecutamos winamp o agregamos a la lista de reproduccion actual el capitulo
rem actual que queremos ver.
%PROGRAMFILES(X86)%\Winamp\winamp.exe /ADD Capitulo_%actual%

rem Salimos de la carpeta emitidas, incrementamos el valor de nuestro capitulo
rem y lo sobreescribimos en el archivo que contiene el numero de capitulo siguiente
cd ..
SET /A "sigueinte=actual_n+1"
echo %siguiente% >Actual.txt

Eleкtro

Hola

Me alegra verte de nuevo por el foro :)



Respuesta Corta:

Tú script está bien, hay ciertas cosas que se pueden mejorar (como la sintaxis, espacios en blanco, y reemplazar el pause dentro del For por la instrucción apropiada... para salir del búcle), pero se puede decir que está bien.

El script de @Black Dragon se podría decir que también está bien, aunque ha cometido algunos fallos de escritura por ejemplo al nombrar una variable de una manera y usarla con otro nombre distinto, y el script no funcionará con archivos que contengan espacios en el nombre ya que encerró NO encerró los strings con comillas dobles, pero por lo que he visto en tu script estás capacitado para corregir tú mismo esos pequeños fallos de sintaxis que él tuvo.



Respuesta Larga:

1) Batch es el lenguaje menos apropiado y el más limitado para este tipo de tareas, deberías intentar usar cualquier otro lenguaje que te permita al menos implementar controles de errores básicos y eficientes cuando de trata de la interacción con archivos ""delicados"".

2) Si todos los archivos contenidos en ese directorio tienen esa enumeración incrementativa (001 > 002 > ... > 100) entonces no es necesario guardar un registro de los archivos que vayas moviendo, simplemente puedes listar los archivos y mover el primero que se encuentre cómo estás haciendo en tu Script, el primero que se encuentre siempre será el sigueinte de la lista (001 > 002 > 003, etc) ya que Batch por defeecto utiliza un ordenamiento por String.
Si los archivos estuviesen enumerados tal que así: 1 > 2 ... > 10, entonces la cosa ya cambia y ahí si que practicamente te obligaría a no utilizar Batch para esa tarea, ya que entonces habría que implementar un ordenamiento de tipo "Bubble Sort" y eso es algo muy tedioso en un lenguaje limitado como es Batch ...cualquier cosa es tediosa.

En todo caso, si guardas un registro como en el ejemplo del compañero @Black Dragon, te sugiero hacerlo en el registro de Windows, no en un archivo de texto, simplemente por seguridad, dada la situación.

3) No existe modo alguno mediante Batch para interactuar/manejar Winamp de forma eficiente (ni siquiera recurriendo a los parámetros comandline de Winamp),
en otros lenguajes puedes literalmente leer el proceso (utilizando técnicas de IPC) para añadir archivos a la lista actual de forma eficiente, aunque esto conlleva una elaboración mucho más elevada del código y una mayor adquisición de conocimientos y entendimiento de lo que estás haciendo, pues alguien que está aprendiendo a programar en Batch no es capaz de elaborar el código necesario, pero por suerte siempre existen APIs que te harían todo el trabajo por ti.

La idea de crear una lista multimedia de tipo m3u me parece buena y simple, es lo que yo hago cuando quiero reproducir una lista aleatoria de mi PC ya que no tiene mayores dificultades que la de escribir los nombres de archivo en un archivo de texto plano, pero eso tiene el inconveniente de que al cargarla en Winamp se reemplazará por la lista actual, y no se si eso es lo que quieres.

Winamp dispone algunos parámetros que puedes usar desde la consola (ej: /ADD ), pero no funcionarán en todos los escenarios... bueno, lo cierto es que a cada usuario le puede funcionar de una manera distinta, por ejemplo si no has registrado winamp en el menú contextual desde las opciones de la aplicación, no funcionará dicho comando por estúpida que parezca la relación entre ambos, ya que Winamp es una aplicación que está bastante bugueada en el sentido de las asociaciones y la integración del menú contextual, y sus handlers para reproducir y añadir archivos a una lista, es algo que hace ya tiempo discutí con los desarrrolladores pero por lo visto no les apetece corregir/mejorar dichas características, o no saben cómo hacerlo.

Hay ciertas aplicaciones commandline que te ayudan a manejar winamp desde la consola, como por ejemplo CLAMP y CLEVER, desconozco sus funcionalidades (no se de que son capaces), pero como último recurso (si no te funciona el parámetro /ADD ni quieres aprender otro lenguaje) siempre puedes recurrir a la utilización de dichas herramientas commandline desde Batch.



Saludos!








Dsalomon

gracias a las 2 respuestas, he corregido una parte, pues la verdad me gusta este lenguaje por su facilidad de compliacion.

la idea es que moviera solo un archivo : el mas del numero meno en su nombre y despues lo reprodujera en winamp

pero hasta el momento mueve los 2 y reproduce los 2 

con esta parte del código:

Código (dos) [Seleccionar]
for /f "tokens=*" %%a in ('dir /b /on E:\series\candy\*.avi') do (
move E:\series\candy\"%%a" E:\series\emitidos
E:\series\emitidos\"%%a"
)


hasra alli todo bien...


y gracias igualmente feliz año elektro... y por cierto gracias por los tips anteriores ya que sin ellos no entendería nada de nada aunque sea...

engel lex

Este lenguaje no se compila se interpreta, eso lo hace un scripting justamente... Sin embargo de los lenguajes de scripting es uno de los menos potentes, ya que su fin es la automatización de procesos lineales para lotes de archivos
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

Eleкtro

Cita de: Dsalomon en 16 Enero 2015, 08:16 AMpero hasta el momento mueve los 2 y reproduce los 2  

No entiendo muy bien que quieres decir con que mueve los "dos".

Prueba a estructurar tú código de la siguiente manera:

Código (dos) [Seleccionar]
@Echo OFF & Title By Elektro


Call :MoveNextFile "avi" "E:\series\candy" "E:\series\emitidos"
Call :PlayInWinamp "%nextFile%"
Pause&Exit /B 0


:MoveNextFile :: %1=fileExt %2=inputDir %3=outputDir var=nextFile
set "fileExt=%~1"
Set "inputDir=%~2"
Set "outputDir=%~3"
For %%# in (
"%inputDir%\*.%fileExt%"
) Do (
Set "nextFile=%%~f#"
(Move "%%~f#" "%outputDir%\%%~nx#")1>NUL
Exit /B 0
)
Goto:EOF


:PlayInWinamp :: %1=filepath %2=wampDir(Optional)
Set "filepath=%~1"
Set "wampDir=C:\Program Files\WinAmp"
If "%~2" NEQ "" (Set "wampDir=%~2")
Start /B "WinAmp" "%wampDir%\winamp.exe" "%filepath%"
Goto:EOF


Saludos








Dsalomon

que tal Elecktro, mira el código esta muy ordenado y fácil de entender,

prácticamente solo cambie la ruta del programa por la variable de programas %PROGRAMFILES(X86)%\Winamp y procedio muy bien


buen el caso que cuando el capitulo seleccionado se añade a la lista de reproducción no muestra el tiempo del vídeo, puedo solo especular que:

o no reconoce la extensión, aunque en las propiedades si lo reconoce como un avi

entonces pensé añadirle la extensión .avi manualmente pero no funciona igual...

Eleкtro

Cita de: Dsalomon en 17 Enero 2015, 08:06 AMbuen el caso que cuando el capitulo seleccionado se añade a la lista de reproducción no muestra el tiempo del vídeo, puedo solo especular que:

Esa información la extrae WinAmp de los archivos, puedes configurar en las opciones de WinAmp para que siempre obtenga los metadatos aunque los archivos aun no hayan sido procesados por el reproductor:



Por otro lado, como bien has deducido winamp no puede reconocer la duración de ciertos archivos de video, creo que la única solución es que mejoren/actualicen el programa en general... creo que para ese problema de la duración del video solo puedes intentar buscar una solución en el foro de winamp.

PD: Aunque en la opción de la imagen especifica que es para leer los títulos, lo cierto es que también es para leer la duración de los archivos.

Saludos








Dsalomon

buena madrugada... pues... gracias por el código... lo tomare como regalito de cumpleaños...
pues la verdad, aun no me ha funcionado... pero me he dedicado a observarlo y por error me di cuenta que:

si por ejemplo la no existe una carpeta "emitidos", el archivo  con el numero menor se reproduce en el playlist de winamp, sin ningún problema... y claro la consola avisa que no encontró el archivo, por lo tanto nada se mueve y el codigo no cumple el 50% de la necesidad.

pero siendo el caso que si existe la carpeta "emitidos", si mueve correctamente de carpeta el archivo con numero menor  y se enlista al playlist de winamp pero no muestra su tiempo, por lo cual no reproduce... igual estoy a medio camino  :-(

yo se que mi objetivo es aprender y no solo ser una maquina de copiar y pegar... pero aqui dejo el codigo que casi no toque...

Código (dos) [Seleccionar]
@Echo OFF & Title By Elektro


Call :MoveNextFile "avi" "G:\Candy capitulos" "G:\Candy capitulos\emitidos"
Call :PlayInWinamp "%nextFile%"
Pause&Exit /B 0


:MoveNextFile :: %1=fileExt %2=inputDir %3=outputDir var=nextFile
set "fileExt=%~1"
Set "inputDir=%~2"
Set "outputDir=%~3"
For %%# in (
"%inputDir%\*.%fileExt%"
) Do (
Set "nextFile=%%~f#"
(Move "%%~f#" "%outputDir%\%%~nx#")1>NUL
Exit /B 0
)
Goto:EOF


:PlayInWinamp :: %1=filepath %2=wampDir(Optional)
Set "filepath=%~1"
Set "wampDir=%PROGRAMFILES(X86)%\Winamp"
If "%~2" NEQ "" (Set "wampDir=%~2")
Start /B "WinAmp" "%wampDir%\winamp.exe" "%filepath%"
Goto:EOF



y también algunas imágenes que ilustran mi intención
con el tema de los metadatos... creo que no era el caso..
por favor abrir las imágenes en una pestaña nueva... pues no encontré como mostrarlas compleas en este foro





gracias..