Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: ovichan en 12 Julio 2013, 05:48 am



Título: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 05:48 am
Hola buenas, estaba intentando hacer un conversor de archivos qpf files (que es un txt con otra extensión) para calcular una serie de codigos de tiempo en base a un numero prefijado de 23.976 frames por segundo.

El caso es que nada mas empezar no me ejecuta la tarea mas basica que es motrar en la consola las lineas del qpf. El código es este:

Código
  1. @echo off
  2. SetLocal EnableDelayEdexpansion
  3.  
  4. @ECHO OFF
  5. FOR /F "tokens=*" %%A IN ("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt") DO CALL:Tratar "%%A"
  6. GOTO:EOF
  7.  
  8. :Tratar
  9.   SET Reg=%~1
  10.   ECHO %Reg%
  11.   GOTO:EOF
  12.  
  13. pause&exit

El formato de un archivo qpf es:

Código:
0 K -1
2616 K -1
16072 K -1
16384 K -1
32440 K -1
34768 K -1

Entonces necesito coger cada numero, tratarlo durante el proceso del for, calcular el codigo de tiempo, e ir almacenandolo en otro txt. El algoritmo sería algo como:

Codigo de tiempo=2616*0,0417083sg=109,1089128sg/60=1,81848188=1min+0,81848188

resto_tiempo=0,81848188*60=49,1089128sg=49sg+109ms

total 1min49sg109ms-->00:01:49.109

Tras calcular el primer resultado tendria que discenir si x>=3600 entonces el resultado que da seria en horas, si x>=60 daria en minutos, x<60 en segundos.

Vamos, pero que me gustaria saber pq no me lista los numeros. Tengo windows8, por si afecta en algo.


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 12 Julio 2013, 09:43 am
me gustaria saber pq no me lista los numeros.

No estás usando comillas en el comando agrupado, no le estás indicando al FOR que se trata de un archivo, en lugar de eso estás usando comillas dobles así que estás leyendo interpretando un String "...\10. QPFILE_NAME.txt", no el contenido del archivo.

Hay dos formas de hacerlo, una es usando el parámetro "usebackq" del FOR y usar sólo comillas, y la otra es usando la sintaxis correcta del For agrupando un comando con comillas: ...In ('Type "archivo"') Do..., bueno, aquí tienes la sintaxis:

Citar
Código:
 FOR /F ["options"] %%parameter IN ('command_to_process') DO command

Citar
Código:
      usebackq     Use the alternate quoting style:                        
                   - Use double quotes for long file names in "filenameset".
                   - Use single quotes for 'Text string to process'
                   - Use back quotes for `command_to_process`


Código
  1. @echo off
  2. SetLocal EnableDelayEdexpansion
  3.  
  4. FOR /F "usebackq delims=" %%A IN (
  5. "C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt"
  6. ) DO (
  7. SET "Reg=%%A"
  8. ECHO !Reg!
  9. )
  10.  
  11. Pause&Exit

Saludos


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 13:19 pm
Vaya, que facil parece y que dolor de cabeza tenia ayer con esto. Gracias.

EDITO: Tengo este codigo pero se cierra el msdos y no puedo ver nada, aparentemente se ejecuta sin fallos.


EDITO2: Solucionado ^^

Código
  1. @echo off
  2. SetLocal EnableDelayEdexpansion
  3.  
  4. @ECHO OFF
  5. FOR /F "usebackq tokens=1" %%A IN (
  6. "C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt"
  7. ) DO (
  8. call:timecode %%A
  9.  
  10. )
  11. goto:finish
  12.  
  13. :timecode
  14. SET /a Reg="%1"
  15. echo %reg%
  16. goto:eof
  17.  
  18. :finish
  19. pause&exit


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 17:39 pm
Creo que la sintaxis es correcta pero me indica que le falta el operador WTF!!

Código
  1. @echo off
  2. Title QPFile to Chapter´s Timecodes
  3.  
  4. @ECHO OFF
  5. For /f "usebackq tokens=1" %%A IN (
  6. "C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.txt"
  7. ) DO (
  8. call:timecode %%A
  9.  
  10. )
  11. Goto:finish
  12.  
  13. :timecode
  14. Set /a reg=%1
  15. Echo %reg%
  16. set /a const=0.0417083
  17. set /a reg=%reg%*%const%
  18. Echo %reg%
  19.  
  20. ::Mensaje de error
  21. IF %reg% GEQ 216000 (color 4E & echo Error. Un video no puede tener una duracion continua igual a un o mas días.)
  22.  
  23. ::Calculo de timecodes partiendo de horas
  24. IF %reg% GEQ 3600 (echo hola 1)
  25.  
  26. ::Calculo de timecodes partiendo de minutos
  27. IF %reg% LSS 3600 (IF %reg% GEQ 60 (echo hola 2))
  28.  
  29. ::Calculo de timecodes partiendo de segundos.
  30. IF %reg% LSS 60 (IF %reg% GEQ 0 (echo hola 3))
  31. Goto:eof
  32.  
  33. :finish
  34. Pause&exit

¿Algo está mal? ¿Acaso no se puede operar con numeros decimales?


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 12 Julio 2013, 18:07 pm
¿Algo está mal? ¿Acaso no se puede operar con numeros decimales?

Exacto, ese es el problema, Batch no soporta operaciones con decimales.

Aunque se pueden llegar a hacer, pero es un jaleo de código y porsupuesto no es algo "nativo" que digamos, diréctamente te recomiendo cualquier otro lenguaje.

Si no quieres depender de tener un intérprete instalado en el PC entonces te iría bien usar VBScript, javascript, O Powershell.

Saludos!


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 18:08 pm
Jeje me lo habia supuesto, estoy aprendiendo ahora a manejar vbscript, me suena de cuando en la facultad toque por encima el visualbasic... pero vamos que fue para importar tablas de excel y hace siglos de eso.... me mueroooooo  :silbar:


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 12 Julio 2013, 18:19 pm
Jeje me lo habia supuesto, estoy aprendiendo ahora a manejar vbscript, me suena de cuando en la facultad toque por encima el visualbasic... pero vamos que fue para importar tablas de excel y hace siglos de eso.... me mueroooooo  :silbar:

No te preocupes, para lo que necesitas no tienes que aprender casi nada, sólo a usar los operadores aritméticos y escribir una rchivo de texto.

Ejemplo:

Código
  1. num1 = 0.5
  2. num2 = 2
  3. Result = (num1 * num2)
  4.  
  5. Wscript.Echo(Result)
  6.  
  7. Set textfile = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\test.txt", 8, true)
  8. textfile.Write(Result & vbCrLf) : textfile.Close
  9.  
  10. Wscript.Quit(0)

Saludos


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 18:21 pm
Pues menos mal porque estaba haciendo esto y no me salia  :-[

Código
  1. Dim valor
  2. Valor1 = 0.0417083
  3. Valor2=2616
  4. valor=valor1*valor2
  5.  
  6. If  valor < 10 then
  7.    "El valor es MENOR a diez "
  8. Else
  9.   document.write( "El valor es MAYOR a diez " & valor)
  10. End if


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 18:42 pm
Se puede hacer un filtrado por tokens de un for de dos, en vbs??


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 12 Julio 2013, 18:50 pm
Se puede hacer un filtrado por tokens de un for de dos, en vbs??

Código
  1. str = "a-b-c-d-e-f"
  2.  
  3. For each token in split(str, "-")
  4.    wscript.echo(token)
  5. next

Saludos


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 19:01 pm
Me sabe mal pero te voy a martirizar. Estoy intentando ir por pasitos. Entonces lo que estoy intentando lo primero es abrir el archivo qpf tal que asi:

Código
  1. 'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
  2. Set objfso = createobject("scripting.filesystemobject")
  3.  
  4. set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  5. msgbox qpfile.readline

Esto funciona, lo muestra en pantalla pero claro lo que quiero que me guarde esa linea en una variable y hacer el filtrado por tokenks como has indicado. Ademas la lectura por lineas creo que deberia usarlo con un for, hasta el final del archivo. Algo quizas como:

Código
  1. Do until ARCHIVO FINALICE
  2.  Procedimiento anterior
  3. Loop until

La condicion ARCHIVO FINALICE imagino que respondera a algun metodo del objeto del archivo de texto. ¿Cuál es?

Siento ser tan cansino. ¬¬'

EDITO: He intentado esto pero algo va mal

EDITO2: Esta parte resuelta

Código
  1. 'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
  2. Set objfso = createobject("scripting.filesystemobject")
  3. dim linea
  4.  
  5. set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  6. linea=qpfile.readline()
  7. msgbox(linea)
  8.  
  9. 'qpfile.copyline(linea)

Hay que ser cafre que estaba intentando meter un string en un objeto. Esto de los objetos siempre me costo entenderlo.... y ya en java con los constructores ni te digo.


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 12 Julio 2013, 19:37 pm
Código
  1. set qpfile=createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  2.  
  3. Do until qpfile.AtEndOfStream
  4. linea=qpfile.readline()
  5. ' o msgbox(qpfile.readline())
  6. Loop

saludos


Título: Re: QPF to Chapter file
Publicado por: ovichan en 12 Julio 2013, 19:49 pm
Por ahora, voy asi... pero por hoy no puedo dedicarle mas tiempo que tengo que sincronizar mas cosas:

Código
  1. 'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
  2. Set objfso = createobject("scripting.filesystemobject")
  3. dim linea
  4. dim numero
  5. dim constante
  6.  
  7. constante=0,0417083
  8.  
  9. 'do
  10. set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  11. linea=qpfile.readline()
  12.  
  13. 'Filtrar linea, para quedarnos con el numero del frame
  14. For each token in split(linea, " ")
  15.     numero=token
  16. exit For
  17. next
  18.  
  19. msgbox(numero)
  20.  
  21. 'loop until qpfile.AtEndOfStream = true

Ahora debo aplicar el algoritmo de conversion. ¿Se puede hacer como en dos, crear una etiqueta (procedimiento) desde el interior del bucle??

No se algo como:

Function Conversion (string x){}


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 12 Julio 2013, 20:32 pm
¿Se puede hacer como en dos, crear una etiqueta (procedimiento) desde el interior del bucle??

Cualquier cosa que haga Batch se puede hacer en otro lenguaje, y mejor xD :

Código
  1. Set   TextFile = createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  2. Const Constant = 0.0417083
  3.  
  4. Do Until TextFile.AtEndOfStream
  5.  
  6. For Each Token in split(TextFile.readline()) ' Te hago saber que por defecto un token es separado por un "espacio".
  7.        Tratar(Token)
  8. Next
  9.  
  10. Loop
  11.  
  12. Wscript.quit
  13.  
  14. Sub Tratar(Token)
  15. MsgBox(Token)
  16. End Sub


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 00:25 am
Buenas otra vez, como tengo que saltar una linea del archivo de texto al que se invoca, mi pregunta es si puedo usar el otro tipo de FOR, con indice y a su vez, usar la opcion de split.

Mi codigo por ahora va asi:

Código
  1. 'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
  2. Set objfso = createobject("scripting.filesystemobject")
  3.  
  4. 'Definicion de variables
  5. dim linea
  6. dim numero
  7. const constante = 0.0417083
  8.  
  9. 'do until qpfile.AtEndOfStream
  10.  
  11. set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  12. linea=qpfile.readline()
  13.  
  14. 'Filtrar linea, para quedarnos con el numero del frame
  15. For each token in split(linea, " ")
  16.     Tratar(token)
  17. exit For
  18. next
  19.  
  20. 'loop
  21.  
  22. Wscript.quit
  23.  
  24. Sub Tratar(Token)
  25. 'Mensaje de error
  26. IF (token >= 216000) THEN
  27.  
  28. msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")
  29.  
  30. ELSE
  31. 'Calculo de timecodes partiendo de horas
  32. IF (token >= 3600) THEN
  33. msgbox("hola1")
  34. ELSE
  35. IF (token < 3600 AND token >= 60) THEN
  36.  
  37. msgbox("hola2")
  38. ELSE
  39. IF (token < 60 AND token >= 0) THEN
  40.  
  41. msgbox("hola3")
  42. ELSE
  43. msgbox("Error. No pueden existir valores negativos.")
  44. END IF
  45. END IF
  46. END IF
  47. END IF
  48.  
  49.  
  50. End Sub
  51.  


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 13 Julio 2013, 02:39 am
Si el problema es que necesitas saltar la primera línea del archivo pues ejecuta esta instrucción 2 veces:

Código
  1. ...
  2.  
  3. qpfile.readline() : linea=qpfile.readline() ' leemos dos lineas, pero nos quedamos con la segunda.
  4.  
  5. For each token in split(linea, " ") ...
  6. ...

EDITO: Si no es eso pues da más detalles... pero ten en cuenta antes de preguntar que puedes usar condicionales...

Código
  1. if not "a" = "A" then   : Wscript.Echo "no" : end if
  2. if Instr("a", "a") then : Wscript.Echo "si" : end if

Saludos


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 03:05 am
Si, era el primer caso que me has puesto pero cuando ejecute el bucle que aun no lo he probado pues estoy depurando el algoritmo, ejecutara cada ciclo con dos lineas.

Código
  1. 'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
  2. Set objfso = createobject("scripting.filesystemobject")
  3.  
  4. 'Definicion de variables
  5. Dim linea
  6. Dim token
  7. Const constante = 0.0417083
  8.  
  9.  
  10. 'do until qpfile.AtEndOfStream
  11.  
  12. set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  13. qpfile.readline() : linea=qpfile.readline()
  14.  
  15. 'Filtrar linea, para quedarnos con el numero del frame
  16. For each token in split(linea, " ")
  17.     Tratar(token)
  18. exit For
  19. next
  20.  
  21. 'loop
  22.  
  23. Wscript.quit
  24.  
  25. 'Subrutina para transformar numero entero en timestamp
  26. Sub Tratar(Token)
  27. 'Establecemos criterio de comparación
  28. calculo=token*constante
  29. p_entera= Cint(calculo)
  30.  
  31. 'Mensaje de error
  32. IF (p_entera >= 216000) THEN
  33. hora=normalizar(calculo)
  34. msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")
  35.  
  36. ELSE
  37. 'Calculo de timecodes partiendo de horas
  38. IF (p_entera >= 3600) THEN
  39. msgbox("hola1")
  40. ELSE 'Calculo de timecodes partiendo de minutos
  41. IF (p_entera < 3600 AND p_entera >= 60) THEN
  42.  
  43. min=calculo\60
  44. seg=calculo mod 60
  45. ms=round(((((calculo/60)-min)*60)-seg),3)*1000
  46. msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")
  47.  
  48. ELSE 'Calculo de timecodes partiendo de segundos
  49. IF (p_entera < 60 AND p_entera >= 0) THEN
  50. msgbox("hola3")
  51. ELSE
  52. msgbox("Error. No pueden existir valores negativos.")
  53. END IF
  54. END IF
  55. END IF
  56. END IF
  57. End Sub

EDITO: De todas maneras creo que hay un problema, pq al retorna a procedimientos principal no se si guarda correctamente los valores de las variables (hora, min, seg, ms). Y creo que no es un buen diseño depender de tantas variables generales, o al menos eso tenia entendido.

¿Más que un procedimiento, no debería ser una función?

EDITO2: Tengo un gran problema con el algoritmo, si fuerzo el valor de tokens=2633, el valor resultante no coincide con el que deberia puesto que automaticamente lo redondea. Me explico.

El frame 2633, tiene un timestamp igual a 01:49.818. Con el algoritmo que he puesto y otros que estoy probando, redondea los valores al inmediato superior. En este caso, los segundos los pasa a 50.

He probado con seg=FormatNumber((calculo/60-min)*60,0), y tambien lo redondea. Ñooooooo


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 13 Julio 2013, 03:41 am
¿Más que un procedimiento, no debería ser una función?

Vamos a ver, no veo que intentes retornar ningún valor ni que tengas planeado hacerlo en un futuro, tal y como lo estás haciendo vas bien, aunque yo lo haría todo dentro del For, pero usa un proc si sigues así ...usa una función si quieres tratar los valores fuera del bloque de la subrutina, en el Ciclo del For.

Óbviamente si deseas "tratar" las variables del proc fuera del proc primero tienes que declararlas...

Código
  1. dim hora
  2.  
  3. sub blabla
  4.   hora = X
  5. end sub
  6.  
  7. msgbox(hora)

saludos


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 03:52 am
Si, las habia declarado pero aun asi como el algoritmo para calcular los segundos, lo hice mediante el modulo, no se que pasa que no lo muestra en pantalla si hago un msgbox despues de haber llamado a la subrutina:

Código
  1. For each token in split(linea, " ")
  2.     Tratar(token)
  3. msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")

De todas maneras, ahora mismo el problema mas grande es que vbs me redondea automaticamente los valores de los resultados inmediatos a su numero entero superior, cosa que en mi caso, no es apropiado. ¿No puedo unicamente quedarme con la parte entera sin que me redondee?


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 13 Julio 2013, 04:01 am
vbs me redondea automaticamente los valores de los resultados inmediatos a su numero entero superior

Es lo que hace la función "Cint", usa "Int" en su lugar.

Por cierto, podrías evitar el uso de if's anidados, no lo soporto, con lo bonito y organizado que queda un Case:

Código
  1. ' Variables
  2. Const constante = 0.0417083
  3.  
  4. ' Do until qpfile.AtEndOfStream
  5.  
  6. set qpfile=createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  7. qpfile.readline()
  8.  
  9. 'Filtrar linea, para quedarnos con el numero del frame
  10. For each token in split(qpfile.readline())
  11.     tratar(token)
  12. exit For
  13. Next
  14.  
  15. ' Loop
  16.  
  17. Wscript.quit
  18.  
  19. 'Subrutina para transformar numero entero en timestamp
  20. Sub Tratar(Frame)
  21.  
  22. 'Establecemos criterio de comparación
  23. calculo  = (Frame * constante)
  24. p_entera = int(calculo)
  25.  
  26. Select Case p_entera
  27.  
  28. Case p_entera >= 216000 'Mensaje de error
  29. hora=normalizar(calculo)
  30. msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")
  31.  
  32. Case p_entera >= 3600 'Calculo de timecodes partiendo de horas
  33. msgbox("hola1")
  34.  
  35. Case p_entera < 3600 AND p_entera >= 60 ' Calculo de timecodes partiendo de minutos
  36. min=calculo\60
  37. seg=calculo mod 60
  38. ms=round(((((calculo/60)-min)*60)-seg),3)*1000
  39. msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")
  40.  
  41. Case p_entera < 60 AND p_entera >= 0 'Calculo de timecodes partiendo de segundos
  42. msgbox("hola3")
  43.  
  44. Case ELSE
  45. msgbox("Error. No pueden existir valores negativos.")
  46.  
  47. End select
  48.  
  49. End Sub

PD: No lo he testeado, pero ya te haces una idea.

Saludos!


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 04:05 am
Vale, ya lo probaré. Y muchas gracias, pero no me lo tengas en cuenta que estoy ofuscado en esto y se me pira la olla. Perdona si te ha molestado.  ;-)


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 13 Julio 2013, 04:10 am
No me molesta aunque si te fijas esto más bien es un tutorial express, lo del cint, el for y los "tokens", y etc no te habría costado nada encontrarlo en Google xD, de hecho yo estaba usando el Split como si fuese un método porque estoy acostumbrado a eso en el resto d elenguajes, y tuve que Googlear para ver que en VBS Split es una función y por lo tanto se escribe delante.

un saludo.


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 04:14 am
Pues te aseguro que he estado buscando en google de hecho me he bajado varios manuales, eso si, todo orientado a html.

Estoy mirando la documentacion aqui http://www.w3schools.com/vbscript/func_round.asp

Tambien en microsoft y me baje el chw 6.5, pero no se pq narices no me muestra la información, pero vamos que te aseguro que he estado buscando en google. Pero no te preocupes, no preguntaré tanto.

Y gracias again  ::)

EDITO: Lo he testeado y había un fallito por el cual no ejecutaba el código.

Lo correcto:
Código
  1. Select Case true

Imagino que todo tiene que ver al usar comparadores logicos en los casos del select. Un ratito me ha llevado encontrarlo T_T  http://computer-programming-forum.com/59-vbscript/08b7100c477ec503.htm


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 06:17 am
Bueno, pues nada muchas gracias Elecktro, ya lo he terminado. El código es totalmente funcional, unicamente me gustaria saber un detallito. ¿Es posible hacer como en BAT, que del directorio actual del archivo vbs, tome los en cuenta el archivos *.qpf? Es para automatizar un poco más, y no tener que estar cambiando cada vez por tres la ruta de acceso. Ya sabes algo como: %~dp0*.qpf

Código
  1. 'Creamos el objeto ActiveX con el que podamos operar con archivos en el sistema.
  2. Set objfso = createobject("scripting.filesystemobject")
  3.  
  4. 'Definicion de variables
  5. Dim linea
  6. Dim token
  7. Dim hora
  8. Dim min
  9. Dim seg
  10. Dim ms
  11. Dim time
  12. Const constante = 0.0417083
  13.  
  14. 'Creamos el objeto del archivo qpf
  15. set qpfile=objfso.Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
  16.  
  17. 'Para evitar que agrege continuamente codigos de tiempo, por un descuido al ejecutar varias veces. Borramos el archivo, si existe
  18. IF (objfso.FileExists("C:\Users\Isra\Desktop\Nueva carpeta\Chapters.txt"))  THEN
  19. objfso.Deletefile("C:\Users\Isra\Desktop\Nueva carpeta\Chapters.txt")
  20. END IF
  21.  
  22. Do until qpfile.AtEndOfStream
  23.  
  24. linea=qpfile.readline()
  25.  
  26. 'Filtrar linea, para quedarnos con el numero del frame
  27. For each token in split(linea, " ")
  28.     Tratar(token)
  29. 'msgbox(hora & " hora. " & min & " min. " & seg & " seg. " & ms & " ms. ")
  30. exit For
  31. next
  32.  
  33. loop
  34.  
  35. Wscript.quit
  36.  
  37. 'Subrutina para transformar numero entero en timestamp
  38. Private Sub Tratar(Token)
  39.  
  40. 'Establecemos criterio de comparación
  41. calculo=token*constante
  42. p_entera= Int(calculo)
  43.  
  44. Select Case true
  45.  
  46. Case p_entera >= 216000 'Mensaje de error
  47. msgbox("Error. Un video no puede tener una duración continua igual a uno o más días.")
  48.  
  49. Case p_entera >= 3600 'Calculo de timecodes partiendo de horas
  50. calculo=calculo/3600
  51. hora=Int(calculo)
  52. min=Int((calculo-hora)*60)
  53. seg=Int((((calculo-hora)*60)-min)*60)
  54. ms=Cint((((((calculo-hora)*60)-min)*60)-seg)*1000)
  55. msgbox(hora & " hora. " & min & " min. " & seg & " seg. " & ms & " ms. ")
  56.  
  57. Case p_entera < 3600 AND p_entera >= 60 'Calculo de timecodes partiendo de minutos
  58. calculo=calculo/60
  59. 'Establecemos para este caso, hora=0
  60. hora=0
  61. min=Int(calculo)
  62. seg=Int((calculo-min)*60)
  63. ms=CInt((((calculo-min)*60)-seg)*1000)
  64. 'msgbox(hora & " hora. " & min & " min. " & seg & " seg. " & ms & " ms. ")
  65. Call Formatear(hora, min, seg, ms)
  66.  
  67. Case p_entera < 60 AND p_entera >= 0 'Calculo de timecodes partiendo de segundos
  68. 'Establecemos para este caso, hora=0
  69. hora=0
  70. min=0
  71. seg=Int(calculo)
  72. ms=CInt((((calculo)-seg))*1000)
  73. msgbox(hora & " hora. " & min & " min. " & seg & " seg. " & ms & " ms. ")
  74.  
  75. Case ELSE
  76. msgbox("Error. No pueden existir valores negativos.")
  77.  
  78. END SELECT
  79. End Sub
  80.  
  81. Private Sub Formatear(hora, min, seg, ms)
  82. 'Damos formato al codigo de tiempo para que añada un cero si es necesario
  83.  
  84. SELECT CASE TRUE
  85.  
  86. CASE hora<10 AND ms<100 'Añadimos un cero delante para dar formato a la hora y los milisegundos.
  87. timestamp="0"&Timeserial(hora,min,seg)&".0"&ms
  88. Call Escribir(timestamp)
  89. CASE hora<10 'Añadimos un cero delante para dar formato a la hora.
  90. timestamp="0"&Timeserial(hora,min,seg)&"."&ms
  91. Call Escribir(timestamp)
  92. CASE ms<100 'Añadimos un cero delante para dar formato los milisegundos.
  93. timestamp=Timeserial(hora,min,seg)&".0"&ms
  94. Call Escribir(timestamp)
  95. CASE ELSE
  96. timestamp=Timeserial(hora,min,seg)&"."&ms
  97. Call Escribir(timestamp)
  98. END SELECT
  99.  
  100.  
  101. end sub
  102.  
  103. Private Sub Escribir (timestamp)
  104.  
  105. 'Escribimos nuestro archivo de capitulos.
  106. Set codigo_tiempo=objfso.opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\Chapters.txt", 8, true) 'creamos el archivo
  107. codigo_tiempo.writeline timestamp
  108. codigo_tiempo.close
  109.  
  110. end sub
  111.  
  112.  
  113.  
  114.  

La verdad pensaba que no me iba a salir, pero gracias a ti, aqui tengo mi primer codigo en vbs ^^  :rolleyes:


Título: Re: QPF to Chapter file
Publicado por: Eleкtro en 13 Julio 2013, 08:57 am
Código
  1. Set FSO = CreateObject("Scripting.FileSystemObject")
  2.  
  3. For Each File In FSO.GetFolder(".\").Files
  4. If LCase(FSO.GetExtensionName(File.Name)) = "qpf" then
  5. Wscript.echo(File.Name)
  6. end if
  7. Next


Título: Re: QPF to Chapter file
Publicado por: ovichan en 13 Julio 2013, 15:09 pm
Muchas gracias.