automatizado de Canal de TV, basado en Batch DOS y VBasic…

Iniciado por Dsalomon, 2 Septiembre 2012, 09:23 AM

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

Dsalomon

Hoy en día dirijo un pequeño pero prometedor proyecto de un canal de TV local, la necesidad de mejorar cada día me ha llevado a crear una serie de herramientas, personalizadas en conjunto con algunas ya existentes, para lograr mi objetivo, mi idea que con los años y ayuda de expertos he ido formando funciona de la siguiente manera:

1. Utilizo Principalmente Winamp (Winamp.exe) para tirar mis videos, películas, etc, debido a que esta aplicación recibe una gran serie de complementos, plugins, comandos, etc.

2.   Como segundo reproductor utilizo otro mas que soporta casi igual o diferente tipo de comandos Bsplayer (Bsplayer.exe) pero el uso especifico es reproducir unplay list con jingles o anuncios

3.   Utilizo un software llamado Ds clock para mostrar la hora en la pantalla (Dsclock.exe)

4.   Y otro para mostrar logotipos llamado Desktop Logo (DsLogo.exe)

5.   Y finalmente otra aplicación de pago llamada TextTcker (Barra.exe)  para el scrool text...

Bueno  dirán que quiere decir con esto, además qye tiene que ver con programación... XD...

Bueno aquí entra lo poco que he implementado... pero hoy por hoy me doy cuenta que necesito saber algo de programación para hacer funcionar todo esto

Para evitar abrir programas por programas cree una pequeña línea de comandos DOS o batch y uno o fusiono las 2 aplicaciones graficas o informativas

Ds Clock (Dsclock.exe)+ Desktop logo (DsLogo.exe) = LOGO Y HORA.bat o compilado .exe

Los scrips anteriores que use son estos, pero ya me están siendo obsoletos o incómodos para mi objetivo por lo cual tratare de compilar uno mejor


Así:

Código (dos) [Seleccionar]

@echo off
START /D "X:\Disco\Programa\Desktop Logo 1" DesktopLogo.exe
ping -n 5 localhost>nul
START /D "C:\Archivos de programa\DS Clock\" dsclock.exe
Exit


o con este otros 2 que me acaban de facilitar
Código (dos) [Seleccionar]

@echo off
FOR /R %%_ in (*DsLogo.exe) do ("%%_")


No sé pero no los pude unir  así que los hice por aparte y después los compile juntos...
Código (dos) [Seleccionar]

@echo off
START /D "%PROGRAMFILES%\DS Clock" dsclock.exe
exit



Para hacerlos desaparecer o quitarlos he usado el comando Batch Kill process

Código (dos) [Seleccionar]

TASKKILL /IM Desktop logo1.exe /F >nul
TASKKILL /IM dsclock.exe /F >nul
TASKKILL /IM TxtTick.exe /F >nul
exit


Pero queda el molesto icono en el Systray que muestra los procesos abiertos.
Como se darán cuenta programar esto es sencillo pero me ha resultado incomodo en algún modo...

Que busco hacer ahora...

1 necesito hacer un script que otra vez el llamado de las aplicaciones graficas pero que corra únicamente si el proceso Winamp está corriendo o activo y si detecta el proceso Bsplayer se cierre:
•   Ds clock
•   DsLogo
•   Barra ( si esta activa y es opcional)


presentación de los intentos de fusionar mi idea
SCRIPT LOGO Y HORA AVANZADO.BAT

Código (dos) [Seleccionar]

@echo off
TASKLIST /FI "winamp.exe " | findstr PID >nul
IF %ERRORLEVEL% LEQ 0 Ping -n 5 localhost >nul & goto  START /D "C:\Archivos de programa\DS Clock\" dsclock.exe & FOR /R %%_ in (*DsLogo.exe) do ("%%_") & Ping -n 5 localhost >nul & goto
IF NOT %ERRORLEVEL% LEQ 0 TASKKILL /IM DsLogo.exe /F >nul & TASKKILL /IM dsclock.exe /F >nul
TASKKILL /IM TxtTick.exe /F >nul do ("%%_") & Ping -n 5 localhost >nul & goto


Pero no se cómo incluir este codigo VB:

ejemplo de codigo VB No. 1

Código (vb) [Seleccionar]
Select Case Status
       Case 1
          WinAMP_GetStatus = "PLAYING"
       Case 3
          WinAMP_GetStatus = "PAUSED"
       Case Else
          WinAMP_GetStatus = "STOPPED"
    End Select




Ejemplo de codigo VB   numero 2:

Código (vb) [Seleccionar]
Function WinAMP_GetStatus() As String

    '----------------------------------------------------------'
    'Emula la condicion de Winamo: Play, Pausa y Detener'
     'Retrieves the status of WinAMP: PLAYING, PAUSED or STOPPED'
    '----------------------------------------------------------'

    Dim Status As Long
    Dim i As Long

    If hWndWinAMP = 0 Then
       MsgBox "WinAMP window not found yet...", vbOKOnly + vbCritical, "WinAMP Not Found"
       Exit Function
    End If

    Status = SendMessage(hWndWinAMP, WM_USER, 0, WA_GETSTATUS)
   
    Select Case Status
       Case 1
          WinAMP_GetStatus = "PLAYING"
       Case 3
          WinAMP_GetStatus = "PAUSED"
       Case Else
          WinAMP_GetStatus = "STOPPED"
    End Select

End Function



Algo así:


Citar┌─────────┐    
   SI
   Winamp está en Play 
↓   Ejecute el Script: 
   Abrir
        1. Ds clock
        2. DsLogo


└─   
┌─   Pero

   Si el proceso Bsplayer .exe  está ejecutándose o Winamp está en pausa    
   
   Ejecute el Script: 
↓   Cerrar los programas
   1. Ds clock
   2. DsLogo
   3. Barra


   FIN
└─────────┘


Que haría ahora compilaría en un solo script el abrir el logo y la hora si se cumplen determinadas acciones, eso me ahorraría mucho trabajo de tareas programadas...
Agradeceré cualquier ayuda.

Saludos desde Guatemala.

Dsalomon.

Dsalomon

viendo otros codigos de por alli logre hacer esto que es casi el 40% de lo que quiero hacer:

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

::set define el proceso con una letra::

:repetir
set w=bsplayer.exe
set Dsl=Dslogo.exe

::buscar el proceso Bsplayer y si lo encuentra cierre el proceso Dslogo::

tasklist | find "%w%" && taskkill /f /im %Dsl% | Ping -n localhost >nul & goto :repetir



::Continuara por que todavia me faltan agregar mas programas juntos ::
exit

Eleкtro

#2
Citar
┌─────────┐    
  SI
  Winamp está en Play
↓   Ejecute el Script:
  Abrir
       1. Ds clock
       2. DsLogo


└─  
┌─   Pero

  Si el proceso Bsplayer .exe  está ejecutándose o Winamp está en pausa    
 
  Ejecute el Script:
↓   Cerrar los programas
  1. Ds clock
  2. DsLogo
  3. Barra


  FIN
└─────────┘


Check.bat
Código (dos) [Seleccionar]
@Echo off

:Check

Rem Reseteamos la variable "CLOSE".
Set Close=

Rem Busca el proceso en activo "bsplayer", Si lo encuentra le da un valor a la variable "Close".
Tasklist /FI "IMAGENAME eq bsplayer.exe"  | Find /I "bsplayer" >NUL && (Set Close=SI)

Rem Busca el proceso en activo "winamp", Si lo encuentra busca la expresión regular en la ventana de título del proceso, para saber si está en pausa y/o detenido, Y si encuentra una de las dos coincidencias le da un valor a la variable "Close"
Tasklist /FI "IMAGENAME eq winamp.exe" /V | Findstr /I "\[detenido\] \[en.pausa\]" >NUL && (Set Close=SI)

Rem Si la variable "close" está definida, Mata los siguientes procesos.
If Defined CLOSE (
Taskkill /F /T /IM "dsclock.exe" >NUL 2>&1
Taskkill /F /T /IM "dslogo.exe" >NUL 2>&1
Taskkill /F /T /IM "barra.exe" >NUL 2>&1
) ELSE (
REM Si la variable "CLOSE" NO está definida, Abre los siguientes procesos.
Start /B dsclock.exe
Start /B dslogo.exe
)


Ping -n 3 LOCALHOST >NUL
Rem Vuelve a la etiqueta principal.
Goto :Check


PD: No te recomiendo que uses el comando ping sin especificar un tiempo de espera (-n) mayor de "1", En tu code dejas el valor vacío y te consumirá bastantes recursos. Además Windows tarda unos segundos en actualizar la lista de procesos etc, Así que no vale la pena comprobar el comando tasklist cada milisegundo, Cada 3 segundos está bien.

Saludos








Dsalomon

preliminarmente lo he corrido pero solo al ejecutar el batch este se cierra... sin mas ni mas, y no hace nada...

con esto he recontraaprendido mucho... siempre te pido si nos puedes explicar las lineas para comprender mejor su funcionamiento...

Dsalomon

aqui dejo hasta donde iva estudiando tus anteriores codigos...
pero como te das cuenta todo depende de un proceso BSPLAYER... y no hay instruccion de play, pausa ni nada... es una burda imitacion del tuyo... ja ja


Código (dos) [Seleccionar]
@echo off
::set define el proceso con una letra::
:: variables de los programas para resumir::
set Bs=bsplayer.exe
set W=Winamp.exe
set Dsl=Dslogo.exe
set DsC=dsclock.exe

::buscar el proceso Bsplayer y si lo encuentra cierre el proceso Dslogo y Dsclock::
:repetir
tasklist | find "%Bs%" && taskkill /f /im %Dsl%
tasklist | find "%Bs%" && taskkill /f /im %Dsc%
tasklist | find "%Bs%" >nul
if %Errorlevel% == 1 (START /D "%Programfiles%\DS Clock\" dsclock.exe)
if %Errorlevel% == 1 (FOR /R %%_ in (*DsLogo.exe) do ("%%_"))
ping -n 05 localhost>nul & goto :repetir

pause

Eleкtro

#5
Cita de: Dsalomon en  3 Septiembre 2012, 10:52 AM
preliminarmente lo he corrido pero solo al ejecutar el batch este se cierra... sin mas ni mas, y no hace nada...
El script funciona perfectamente en windows 7, Pero tampoco veo ninguna diferencia en la sintaxis que pueda causar que no funcione bajo la CMD de windows XP.

EDITO: Acabo de probar el script en Una máquina virtual con Win XP SP 3 y Tal como pensaba, funciona. Si has manipulado el script de alguna manera, O si lo has acolpado a otro script, Pues postea la modificación porque ya no tiene que ver con el script original.

De todas formas, Abre la consola y escribe el nombre del bat para ejecutarlo (Desde la consola, No haciendo doble click en el archivo bat ni llamandolo desde otro bat), Así te indicará la posible causa del error y se te podrá ofrecer más ayuda.
En consola:
Código (dos) [Seleccionar]
CMD /K "check.bat"

Cita de: Dsalomon en  3 Septiembre 2012, 10:52 AM
siempre te pido si nos puedes explicar las lineas para comprender mejor su funcionamiento...
He añadido comentarios al script en mi último comentario.

El último code que has posteado como bien dices está incompleto y tiene sus fallos, El código de salida (%Errorlevel%) Se refiere al último comando que se ejecutó por lo tanto no es efectivo de la manera que lo has hecho, No sigas pensando en como hacer el script, arriba te di la solución, veamos que es lo que está causando el cierre que comentas y una vez arreglado eso ya estará.

Saludos








Dsalomon

gracias por corregirlo... solo puse el codigo anterior como referencia... pero ahora estoy en el codigo tuyo...

probare nuevamente en una maquina virtual... buena idea

Dsalomon

eres un genio...


funciona pero ahora me doy cuenta que he planteado mal el funcionamiento... permiteme lo replanteo correctamente... en win XP corrio perfecto.... en 7 lo probare por que mi sistema 7 ya esta algo trasteado..

Dsalomon

#8
Perdona me confundi al armar la idea pero creo que aqui corregi la estructura y encontre algunas consideraciones para el funcionamiento


Para Winamp:
   
Código (dos) [Seleccionar]
START /D "%Programfiles%\Winamp\" winamp.exe


Para el Programa DsLogo y los derivados numéricos:
Dslogo, Dslogo1 y Dslogo2 los guardo en una subcarpeta dentro de
la carpeta donde se guarda el BAT por eso pongo este código por que no Abrir el proceso DsLogo.exe conozco otro:
   
Código (dos) [Seleccionar]
FOR /R %%_ in (*DsLogo.exe) do ("%%_")

Para el programa Ds Clock:
Código (dos) [Seleccionar]
START /D "%Programfiles%\DS Clock\" dsclock.exe

Para el programa Bsplayer:
Código (dos) [Seleccionar]
START /D "%Programfiles%\Webteh\BSplayerPro"  bsplayer.exe

Para el programa Text Ticket:
Código (dos) [Seleccionar]
START /D "%Programfiles%\Text Ticker\TxtTick.exe"

Citar
┌─────────────────────────────────────┐


1. ABRIR el programa Winamp y darle PLAY 
                                               

  • Continúe al paso 2

                           
■ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─    



┌─────────────────────────────────────┐    

↓   
                              
2. SI El programa Winamp.exe está en PLAY
            

  • Abrir programa Ds clock                                     
  • Abrir el proceso DsLogo.exe
↓                                 


└──────────────────────────────────────   
3.   Pero   Si el proceso Bsplayer.exe se ejecuta         ↓                  
┌──────────────────────────────────────   

                              

  • PAUSAR Winamp
  • Cerrar el proceso Dsclock.exe
  • Cerrar el proceso DsLogo.exe
  • Cerrar el proceso DsLogo1.exe
  • Cerrar el proceso DsLogo2.exe
  • Cerrar el proceso TxTicker.exe

↓                                 


└──────────────────────────────────────   
4. CUANDO El proceso Bsplayer.exe se cierre o no este activo         ↓                  
┌──────────────────────────────────────   



  • REPETIR INFINITO DEL PASO 2 AL PASO 4   
↓                                 

└─────────────────────────────────────┘

Eleкtro

Citardarle PLAY 
CitarPAUSAR Winamp

Para hacer eso solo puedes hacerlo con el puntero del mouse...

Descarga NIRCMD, y lee ejemplos:
Problema con Comando para hacer fuerza bruta
Crear una tarea prograbada en bat

Para hacer un bucle infinito solo tienes que crear una etiqueta en el "paso 2" y llamarla en el "paso 4", Cuando terminen los chequeos...

Saludos