Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: Eleкtro en 1 Marzo 2012, 18:57 pm



Título: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 1 Marzo 2012, 18:57 pm
¿Como randomizar el contenido de un txt?  :huh:

Es lo único que me falta para acabar este script :P

PD: Acepto cualquier utilidad externa
PD2: Si existiera algún parámetro para iniciar Winamp con la opcion "Activar modo aleatorio de lista" activada, también me serviría...

un saludo

Código
  1. @Echo OFF
  2.  
  3. Set Carpeta=%~n0
  4.  
  5. Echo #EXTM3U>"%Temp%\Lista Winamp.m3u"
  6. For /F "Tokens=*" %%$ in ('Dir /B /S "%CARPETA%" ^| Findstr /R ".aif .flac .m4a .mid .mp3 .ogg .wav .wma"') do (Echo %%$>>"%Temp%\Lista Winamp.m3u")
  7. REM Aqui iría el randomizado
  8. Start /B C:"\Program Files (x86)\Winamp\winamp.exe" "%Temp%\Lista Winamp.m3u"


Título: Re: [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 1 Marzo 2012, 19:45 pm
Ya se me ocurrió la forma, sorry


Código
  1. @Echo OFF
  2. Setlocal enabledelayedexpansion
  3.  
  4. Set Carpeta=%~n0
  5.  
  6. Echo #EXTM3U>"%Temp%\Lista Winamp.tmp"
  7. For /F "Tokens=*" %%$ in ('Dir /B /S "%CARPETA%" ^| Findstr /R ".aif .flac .m4a .mid .mp3 .ogg .wav .wma"') do (Echo  !Random!!Random!!Random!;%%$>>"%Temp%\Lista Winamp.tmp")
  8.  
  9. Echo #EXTM3U>"%Temp%\Lista Winamp.m3u"
  10. For /F "Tokens=2* Delims=;" %%a in ('Type "%Temp%\Lista Winamp.tmp" ^| Sort ') do (Echo  %%a>>"%Temp%\Lista Winamp.m3u")
  11. Start /B C:"\Program Files (x86)\Winamp\winamp.exe" "%Temp%\Lista Winamp.m3u"
  12.  


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 6 Octubre 2013, 19:40 pm
Reviviendo esto... una duda... yo lo uso así pero como decirle que solo haga una lista de reproducción de, por ejemplo unos 10 archivos, o 5 archivos...  ;-)

gracias


Código
  1. @Echo OFF
  2. Title %~n0
  3. Mode con cols=50 lines=3
  4. Setlocal enabledelayedexpansion
  5. chcp 1252 >NUL
  6. For /F "Tokens=*" %%$ in ('Dir /B /S "%~dp0" ^| Findstr /R ".avi .mkv"') do (Echo !Random!!Random!!Random!;%%$>>"%Temp%\Lista Winamp.tmp")
  7. Echo #EXTm3u8>"%Temp%\Lista Winamp.m3u8"
  8. For /F "Tokens=2* Delims=;" %%$ in ('Type "%Temp%\Lista Winamp.tmp" ^| Sort ') do (Echo %%$>>"%Temp%\Lista Winamp.m3u8")
  9. Start /B "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Temp%\Lista Winamp.m3u8"


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 6 Octubre 2013, 20:11 pm
como decirle que solo haga una lista de reproducción de, por ejemplo unos 10 archivos, o 5 archivos...  ;-)

Código
  1. @Echo OFF & chcp 1252 >NUL & Setlocal enabledelayedexpansion
  2. REM Title %~n0 & Mode con cols=50 lines=3
  3.  
  4. Set /A "MAX=5"
  5. Set "TMP_Playlist=%Temp%\Playlist.tmp"
  6. Set "Playlist=%Temp%\Playlist.m3u8"
  7.  
  8. :List
  9. (
  10. For /F "Tokens=*" %%$ in (
  11.     'Dir /B /S "%~dp0" ^| Findstr /I /R "\.avi$ \.mkv$"'
  12. ) DO (
  13.     Echo !Random!!Random!!Random!;%%$
  14. )
  15. )>"%TMP_Playlist%"
  16.  
  17. :Randomize
  18. (
  19. Echo #EXTm3u8
  20. For /F "Tokens=2* Delims=;" %%$ in (
  21.     'Type "%TMP_Playlist%" ^| Sort '
  22. ) DO (
  23. Set /A "Count+=1"
  24.     If !COUNT! LSS %MAX% (
  25.         Echo %%$
  26.     ) ELSE (
  27.         Goto :Run
  28.     )
  29. )
  30. )>"%Playlist%"
  31.  
  32. :Run
  33. Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)
  34.  
  35. Exit /B 0

Saludos!


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 6 Octubre 2013, 23:37 pm
gracias EleKtro.... como siempre las mejores respuestas


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 9 Octubre 2013, 09:52 am
abusando de la confianza podría ser modificado el código para que en lugar de reproducir se añadan a la cola de archivos para reproducir..


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 9 Octubre 2013, 16:02 pm
Hola


El switch "/ADD" de la aplicación WinAmp sirve precísamente para cargar un archivo sin iniciar su reproducción automática.

Para WinAmp:
Código
  1. Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" /ADD "%Playlist%" || (Exit /B 1)

(Información adicional) Para MPC-HC:
Código
  1. Start /B "" "Ruta de MediaPlayerClassic HomeCinema.exe" /Open "%Playlist%" || (Exit /B 1)


PD: De otra forma esto no sería posible hacerlo usando un lenguaje tan simple como Batch, leete la documentación CommandLine del programa.


Haz el favor de comunicar por aquí si el problema está solucionado para cerrar este hilo y que no se vuelva a revivir.


Saludos!


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 11 Octubre 2013, 01:59 am
maestro tengo una duda...

cuando coloco el archivo de aplicación

clever.exe

en otra carpeta siempre del escritorio el código se cierra y no me funciona...

pensé remediarlo de esto:
Código
  1. IF %ERRORLEVEL% LEQ 0 cd %UserProfile%\Desktop\clever pause | clever.exe pause >nul & goto :Comprobar

a esto pero no me funciono:
Código
  1. IF %ERRORLEVEL% LEQ 0 FOR /R %%_ in (*clever.exe) do ("%%_") | clever.exe pause >nul | Taskkill /f /IM TxtTick.exe >nul & goto :Esperar


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 11 Octubre 2013, 02:56 am
Mientras sigas escribiendo código de la manera en la que lo estás haciendo, los errores no van a cesar.

1. Usa los operadores de agrupación para agrupar los comandos ().

2. Encierra todos los argumentos "" (sobretodo el de la ruta de directorio...).

3. Comprueba si el error se solucionó.

Saludos


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 11 Octubre 2013, 06:03 am
maestro perdón por 2 cosa

la primera por colocar  la pregunta en el tema equivocado y la segunda por la preguntadera... si no entendí mal solo debo agregar () a la ruta:

Código
  1. IF %ERRORLEVEL% LEQ 0 (FOR /R %%_ in (*clever.exe) do ("%%_")) | clever.exe pause >nul | Taskkill /f /IM TxtTick.exe >nul & goto :Esperar



Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 11 Octubre 2013, 17:05 pm
No puedo ayudarte mucho más porque no entiendo porque intentas usar las Pipes del For con el programa Clever, no tengo estas utilidades de Winamp y tampoco comentas lo que se supone que debería suceder al redireccionar a este programa, entonces solo puedo aconsejarte que mejores la sintaxis/integridad del código y poco más.

Prueba algo así:
Código
  1. IF %ERRORLEVEL% EQU 0 (cd "%UserProfile%\Desktop\clever pause") | (clever.exe pause 1>nul & Goto :Comprobar)

Código
  1. IF %ERRORLEVEL% EQU 0 (FOR /R %%_ in ("*clever.exe") do (start /B "" "%%_")) | clever.exe pause 1>nul | (Taskkill /F /IM TxtTick.exe >nul & Goto :Esperar)

Saludos


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 12 Octubre 2013, 07:24 am
maestro como esto ya es diferente a lo tratado mejor abri un tema para esto..


http://foro.elhacker.net/scripting/uso_de_clever_en_winamp-t400500.0.html;msg1890828#msg1890828 (http://foro.elhacker.net/scripting/uso_de_clever_en_winamp-t400500.0.html;msg1890828#msg1890828)

si me pudieras ayudar... ya que solo soy una aprendiz...

por cierto muy interesante el tema que tienes bloqueado por hacer el tutorial de script...



Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 13 Octubre 2013, 09:15 am
te tengo 2 peticiones para el tema especifico de las lineas en ramdom

1- que los archivos ya no se repitan

2- sera que se le puede poner duracción especifica de tiempo

lei algo al respecto pero no se que tan cierto sea


Código
  1. #EXTM3U
  2. #EXTINF:516,c.04-10-12_07-46.01.avi
  3. #EXTVLCOPT:start-time=14
  4. #EXTVLCOPT:stop-time=30
  5. C:\jb\postdv\2004BrissagoCalvia\c.04-10-12_07-46.01.avi


Citar
Los tiempos están dados al segundo más cercano solamente, así que esto no iba para el trabajo de edición no lineal,


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 13 Octubre 2013, 09:41 am
Creo que no existe esa información en la estructura M3U, no estoy seguro, pero no creo que cueste tanto abrir la wikipedia, buscar, e informarse: http://en.wikipedia.org/wiki/M3U

Citar
Código:
Directive 	Description                                      	Example
#EXTM3U File header. Must be the first line of the file! #EXTM3U

#EXTINF Track information, including runtime and title. #EXTINF:191,Artist Name - Track Title


Para especificar el tiempo de duración tienes que crear otro tipo de lista multimedia, por ejemplo "pls", y eso requiere escribir el código desde cero para adaptarlo a la estructura de la nueva lista multimedia.

Pero además, usando Batch no es posible obtener la información de duración de un archivo multimedia, ya te lo dije que pides cosas que con Batch no es posible y va siendo hora de que uses otro lenguaje.

De todas formas puedes usar la aplicación MediaInfo desde la consola para obtener la duración de un archivo multimedia: http://mediaarea.net/es/MediaInfo/Download/Windows

Saludos


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 21 Octubre 2013, 08:21 am
Código
  1. @Echo OFF & chcp 1252 >NUL & Setlocal enabledelayedexpansion
  2. REM Title %~n0 & Mode con cols=50 lines=3
  3.  
  4. Set /A "MAX=5"
  5. Set "TMP_Playlist=%Temp%\Playlist.tmp"
  6. Set "Playlist=%Temp%\Playlist.m3u8"
  7.  
  8. :List
  9. (
  10. For /F "Tokens=*" %%$ in (
  11.     'Dir /B /S "%~dp0" ^| Findstr /I /R "\.avi$ \.mkv$"'
  12. ) DO (
  13.     Echo !Random!!Random!!Random!;%%$
  14. )
  15. )>"%TMP_Playlist%"
  16.  
  17. :Randomize
  18. (
  19. Echo #EXTm3u8
  20. For /F "Tokens=2* Delims=;" %%$ in (
  21.     'Type "%TMP_Playlist%" ^| Sort '
  22. ) DO (
  23. Set /A "Count+=1"
  24.     If !COUNT! LSS %MAX% (
  25.         Echo %%$
  26.     ) ELSE (
  27.         Goto :Run
  28.     )
  29. )
  30. )>"%Playlist%"
  31.  
  32. :Run
  33. Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)
  34.  
  35. Exit /B 0

Saludos!


Maestro después de un par de días viendo el resultado del código que tuviste a bien a facilitar y aun mejorar, le estoy hallando un inconveniente... pero tu dimelo si no me equivoco...

efectivamente el código toma en este caso de una carpeta de manera aleatoria 5 archivos... pero observando... me fije que siempre toma los 5 primeros de la carpeta y a esos 5 les aplica el RANDOM... habrá alguna manera que de toda la carpeta (en mi caso la carpeta tiene mas de 50 archivos) tome 5 aleatorios no dependiendo de su nombre, para que al final juege los 50 y tome 5 de manera aleatoria...?

ahora si me confundo ... perdona las molestias muchas...


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Eleкtro en 21 Octubre 2013, 11:22 am
Hola

Estás equivocado, todos los archivos (todos, no los 5 primeros) se escriben de forma ordenada en el archivo Playlist.tmp, pero añadiéndole un número aleatorio a la izquierda, de esta manera:

Código:
70341602815107;C:\archivo1
48242686216352;C:\archivo2
65562921929452;C:\archivo3
240062826615990;C:\archivo4
11032263219974;C:\archivo5
etc...

Luego la lista se ordena de menor a mayor según los números aleatorios, consiguiende así un shuffle, los nombres de la derecha quedan desordenados:

Código:
11032263219974;C:\archivo5
240062826615990;C:\archivo4
48242686216352;C:\archivo2
65562921929452;C:\archivo3
70341602815107;C:\archivo1
etc...

Y por último se eliminan los números, y se toman los primeros 5 archivos de la lista:

Código:
C:\archivo5
C:\archivo4
C:\archivo2
C:\archivo3
C:\archivo1

Nunca tendrán el mismo orden, ni serán siempre los mismos archivos.

PD: He vuelto a probar el código por si acaso, pero no, no llevas razón, nunca obtengo los mismos archivos.

Si le has hecho alguna modificación al código original deberías postearla para buscar y corregir el error.

Saludos!


Título: Re: (Solucionado) [Batch] Randomizar lineas en un txt?
Publicado por: Dsalomon en 21 Octubre 2013, 18:18 pm
 ;-) gracias maestro... no le hice mucho mas que definir los formatos... pero revisare en una virtual para postear mas adelante... desde ya muchas gracias..


Título: Bugs o inconsistencias hayadas en produccion
Publicado por: Dsalomon en 31 Mayo 2014, 09:06 am
Buena noche… reaperturo el tema con una pregunta e inquietud si se me permite

Este código proporcionado es una de las aportaciones más fantásticas que me he encontrado en mi vida de internauta… por lo cual dia a día es una de mis herramientas de trabajo… durante los años de uso he notado 3 problemas o bugs o la verdad no sé cómo llamarles y para ir al grano proporcionare primero las variantes que le he añadido…


Código
  1. @Echo OFF & chcp 1252 >NUL & Setlocal enabledelayedexpansion
  2. REM Title %~n0 & Mode con cols=50 lines=3
  3.  
  4. Set /A "MAX=10"
  5. Set "TMP_Playlist=%Temp%\Playlist.tmp"
  6. Set "Playlist=%Temp%\Playlist.m3u8"
  7.  
  8. :List
  9. (
  10. For /F "Tokens=*" %%$ in (
  11.     'Dir /B /S "%~dp0" ^| Findstr /I /R "\.avi$ \.mkv$"'
  12. ) DO (
  13.     Echo !Random!!Random!!Random!;%%$
  14. )
  15. )>"%TMP_Playlist%"
  16.  
  17. :Randomize
  18. (
  19. For /F "Tokens=2* Delims=;" %%$ in (
  20.     'Type "%TMP_Playlist%" ^| Sort '
  21. ) DO (
  22. Set /A "Count+=1"
  23.     If !COUNT! LSS %MAX% (
  24.         Echo %%$
  25.     ) ELSE (
  26.         Goto :Run
  27.     )
  28. )
  29. )>"%Playlist%"
  30.  
  31. :Run
  32. if %PROCESSOR_ARCHITECTURE%==x86 (
  33.  Start /B "" "%PROGRAMFILES%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)
  34. ) else (
  35.  Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)
  36. )
  37.  
  38. Exit /B 0

El resultado es que me crea y reproduce un playlist en el amigo Winamp…
con la cantidad de 10 archivos en un playlist en Winamp, los cuales fueron definidos en la variable "MAX=10"

1.   el primer problema o bug es que al encontrar un archivo con caracteres especiales digamos tildes, eñe, etc. Los añade pero no los reproduce haciendo que winamp se culgue al no saber interpretar el archivo

Ejemplo: "Líneas de la vida.avi" la muestra como "L�neas de la vida" dentro del playlist del reproductor y cuelga Winamp por que no lo puede reproducir


2.   al ejecutarse en el código en forma de Batch crea la lista correctamente, generando un playlist de 10 archivos de video.


Después aunque añada manualmente al playlist,  por alguna razón la reproducción se detiene en el archivo final… aunque después haya añadido un archivo o archivos, no entiendo por qué pero lo hace.

3.   Y como el archivo batch lo uso por lo general en carpetas con determinada colección de archivos y ya lo había mencionado

El RANDOM siempre elige el mismo juego de archivos

Suponiendo que tengo 10 archivos de video en una carpeta y el código crea un playlist con 5 archivos RAMDOM siempre elige los mismos 5 solo que los aplica aleatoriamente aunque tenga 10 la carpeta siempre elige los mismos 5 y les aplica RAMDOM o sea no se ejecuta en los archivos restantes…

La verdad me gustaría mucho entender la lógica del lenguaje para poder hacer  mis propias deducciones, pero mejor solicito ayuda para poder corregirlo.

De antemano Gracias…