(Solucionado) [Batch] Randomizar lineas en un txt?

Iniciado por Eleкtro, 1 Marzo 2012, 18:57 PM

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

Eleкtro

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 (dos) [Seleccionar]
IF %ERRORLEVEL% EQU 0 (cd "%UserProfile%\Desktop\clever pause") | (clever.exe pause 1>nul & Goto :Comprobar)

Código (dos) [Seleccionar]
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








Dsalomon

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

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...


Dsalomon

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 (dos) [Seleccionar]
#EXTM3U
#EXTINF:516,c.04-10-12_07-46.01.avi
#EXTVLCOPT:start-time=14
#EXTVLCOPT:stop-time=30
C:\jb\postdv\2004BrissagoCalvia\c.04-10-12_07-46.01.avi



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

Eleкtro

#13
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

CitarDirective 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








Dsalomon

Cita de: EleKtro H@cker en  6 Octubre 2013, 20:11 PM
Código (dos) [Seleccionar]
@Echo OFF & chcp 1252 >NUL & Setlocal enabledelayedexpansion
REM Title %~n0 & Mode con cols=50 lines=3

Set /A "MAX=5"
Set "TMP_Playlist=%Temp%\Playlist.tmp"
Set "Playlist=%Temp%\Playlist.m3u8"

:List
(
For /F "Tokens=*" %%$ in (
    'Dir /B /S "%~dp0" ^| Findstr /I /R "\.avi$ \.mkv$"'
) DO (
    Echo !Random!!Random!!Random!;%%$
)
)>"%TMP_Playlist%"

:Randomize
(
Echo #EXTm3u8
For /F "Tokens=2* Delims=;" %%$ in (
    'Type "%TMP_Playlist%" ^| Sort '
) DO (
Set /A "Count+=1"
    If !COUNT! LSS %MAX% (
        Echo %%$
    ) ELSE (
        Goto :Run
    )
)
)>"%Playlist%"

:Run
Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)

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...

Eleкtro

#15
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:

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:

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:\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!








Dsalomon

 ;-) gracias maestro... no le hice mucho mas que definir los formatos... pero revisare en una virtual para postear mas adelante... desde ya muchas gracias..

Dsalomon

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 (bash) [Seleccionar]
@Echo OFF & chcp 1252 >NUL & Setlocal enabledelayedexpansion
REM Title %~n0 & Mode con cols=50 lines=3

Set /A "MAX=10"
Set "TMP_Playlist=%Temp%\Playlist.tmp"
Set "Playlist=%Temp%\Playlist.m3u8"

:List
(
For /F "Tokens=*" %%$ in (
     'Dir /B /S "%~dp0" ^| Findstr /I /R "\.avi$ \.mkv$"'
) DO (
     Echo !Random!!Random!!Random!;%%$
)
)>"%TMP_Playlist%"

:Randomize
(
For /F "Tokens=2* Delims=;" %%$ in (
     'Type "%TMP_Playlist%" ^| Sort '
) DO (
Set /A "Count+=1"
     If !COUNT! LSS %MAX% (
         Echo %%$
     ) ELSE (
         Goto :Run
     )
)
)>"%Playlist%"

:Run
if %PROCESSOR_ARCHITECTURE%==x86 (
  Start /B "" "%PROGRAMFILES%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)
) else (
  Start /B "" "%PROGRAMFILES(X86)%\Winamp\winamp.exe" "%Playlist%" || (Exit /B 1)
)

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...