¿Cómo puedo hacer que la computadora emita un pitido desde un script / programa llamado por el programador de tareas de Windows?

4

Estoy usando Windows 7 Home Edition. Quiero hacer que mi computadora espere un cierto tiempo, luego emitir un pitido antes de que finalice un programa. Como prueba, escribí el siguiente archivo por lotes para hacer que Windows Media Player reproduzca la radio, espere 10 segundos, luego emita un pitido y apáguelo:

@echo off
start "_" "C:\Program Files (x86)\Windows Media Player\wmplayer.exe" "http://www.cpr.org/content_category_templates/listenTemplate/listenClassical48.asx"
sleep 10
@echo ^G
@echo ^G
@echo ^G
@echo ^G
taskkill /im wmplayer.exe /f

Nota: siguiendo las instrucciones que encontré en otra pregunta de este sitio, la cosa "^ G" es el carácter que se obtiene al escribir control + G en un símbolo del sistema. Parece que no aparece en este sitio, así que lo reemplacé con ^ G.

Esto funcionó perfectamente. Hasta que, es decir, intenté hacer que se ejecutara automáticamente utilizando el Programador de tareas de Windows. Intenté esto varias veces y no sonó. Las otras funciones funcionaron bien, pero no se escuchó ningún pitido.

La secuencia de comandos no se ejecutó en una ventana cuando la inició el programador de tareas, y llegué a la conclusión de que esto debe causar problemas con el comando echo (nada de lo que hacer eco). Entonces, después de dedicar un tiempo a buscar un método para provocar el sonido que no implicaba eco, finalmente reescribí todo en forma de un programa de consola VB .NET:

Imports System.Threading

Module Beep

    Sub Main()
        Dim wmp As New System.Diagnostics.Process
        wmp.StartInfo.FileName = "C:\Program Files (x86)\Windows Media Player\wmplayer.exe"
        wmp.StartInfo.Arguments = "http://www.cpr.org/content_category_templates/listenTemplate/listenClassical48.asx"
        wmp.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
        wmp.Start()
        Thread.Sleep(New TimeSpan(0, 0, 10))
        Console.Beep()
        Console.Beep()
        Console.Beep()
        Console.Beep()
        wmp.Kill()
    End Sub

End Module

Esto funciona de la misma manera, incluido el hecho de que solo suena cuando se llama manualmente. Cuando se llama desde el programador de tareas, también falla al emitir un pitido. No estoy seguro de qué más probar aquí. Cualquier ayuda sería apreciada.

gorcq
fuente

Respuestas:

4

Es posible que haya un problema al intentar iniciar el sistema del reproductor de medios desde un script. Puede crear un script por lotes con el Ctrl+G como mencionó, y usará el pitido del sistema. No creo que el Ctrl+C El método del que hablabas realmente funciona.

Abra un símbolo del sistema, cambie los directorios donde desea guardar el archivo por lotes y escriba los siguientes comandos:

copy con beep.cmd

Ctrl + sol , Ctrl + Z

Ahora si corres beep.cmd, debe utilizar el pitido del sistema.

Creé una tarea del sistema para ejecutar este archivo por lotes, y cuando ejecuto la tarea manualmente, aparece la ventana de comandos y suena, luego sale.

La forma en que funciona es que copia todo lo que escriba en la ventana de comandos en el archivo especificado, en este caso beep.cmd. No se puede poner ^G en el archivo, a pesar de que eso es lo que aparece en la pantalla, porque escribir eso es simplemente escribir ^ y G, mientras ^G Es en realidad una representación de un carácter ASCII diferente por completo. Al utilizar el método de la ventana de comandos, puede guardar la pulsación real en el archivo. Luego puede editar el archivo por lotes si desea hacer otras cosas, solo asegúrese de mantener la línea con el carácter especial. Probablemente se verá como una caja vacía en el bloc de notas.

nhinkle
fuente
Lo siento, que ^ C es un error tipográfico. Hice ctrl + G en el archivo por lotes real. Estoy bastante seguro de que es cierto porque funciona cuando ejecuto el archivo manualmente. Solo para asegurarme, he rediseñado correctamente el archivo por lotes justo ahora, con los mismos resultados. Voy a editar mi pregunta para evitar futuras confusiones.
gorcq
0

Busque una opción en su Programador de tareas en las propiedades de su Tarea programada llamada [algo en la línea de] "interactuar con el usuario" o "interactiva" (o algo así). Debería ser una casilla de verificación y, si la activa, debería hacer que su tarea aparezca en la GUI y en el sistema de audio.

En su defecto, Steve Gibson (el creador de la famosa utilidad de reparación de discos SpinRite) tiene una herramienta gratuita de línea de comandos llamada "Wizmo" que puede reproducir un archivo .wav desde un archivo por lotes:

Wizmo (no requiere instalación - esta es una herramienta independiente)
http://www.grc.com/wizmo/wizmo.htm

Espero que esto pueda hacer el trabajo por usted también (si lo hace, obviamente necesitará grabar un pitido en un archivo .wav).

Randolf Richardson
fuente
No veo ninguna opción que contenga la palabra interactivo o similar. Voy a tener que mirar más de cerca esa cosa de Wizmo.
gorcq
@gorcq: recuerdo haber visto esta opción en Windows XP, pero en Windows 7 parece que ha desaparecido. Eso es muy malo (me gustaría que Microsoft no dejara caer buenas características como esta). = (
Randolf Richardson
Vi la opción interactiva en Windows Server 2008 (Vista Server). ¿Lo habrían eliminado de 7 si el Programador de tareas usa la misma DLL para estas dos versiones de Windows? EDITAR Puedo estar equivocado.
Ahora he intentado con wizmo, y tengo el mismo problema: funciona bien cuando se ejecuta manualmente desde la línea de comandos, pero no emite ningún pitido cuando el Programador de tareas lo ejecuta. Acabo de editar el archivo por lotes que se muestra arriba y reemplacé todas las instancias de "@echo ^ C" con "wizmo play =" C: \ Windows \ Media \ Windows Critical Stop.wav "".
gorcq
1
@Randolph Potter: ¡Gracias por confirmar que recuerdo en lugar de imaginar! (No puedo editar mi comentario anterior, por lo que acabo de agregar este con la ortografía correcta del nombre de Randolph).
Randolf Richardson