it-swarm-es.com

Ejecute un archivo .bat en una tarea programada sin una ventana

Tengo una tarea programada que inicia un script por lotes que ejecuta robocopy cada hora. Cada vez que se ejecuta, aparece una ventana emergente en el escritorio con la salida de robocopy, que realmente no quiero ver.

Logré hacer que la ventana parezca minimizada haciendo que el trabajo programado se ejecute

cmd /c start /min mybat.bat

pero eso me da una nueva ventana de comando cada hora. Me sorprendió esto, dado cmd /c "Ejecuta el comando especificado por cadena y luego termina" - Debo haber entendido mal los documentos.

¿Hay alguna manera de ejecutar un script por lotes sin que aparezca una ventana cmd?

144
Tom Dunham

En su lugar, puede ejecutarlo en silencio usando un archivo de Windows Script. El Método de ejecución le permite ejecutar un script en modo invisible. Crear un .vbs archivo como este

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

y programarlo El segundo argumento en este ejemplo establece el estilo de la ventana. 0 significa "ocultar la ventana".

Sintaxis completa de Método de ejecución :

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

Argumentos:

  • objeto: objeto WshShell.
  • strCommand: valor de cadena que indica la línea de comando que desea ejecutar. Debe incluir cualquier parámetro que desee pasar al archivo ejecutable.
  • intWindowStyle: opcional. Valor entero que indica la apariencia de la ventana del programa. Tenga en cuenta que no todos los programas hacen uso de esta información.
  • bWaitOnReturn: opcional. Valor booleano que indica si el script debe esperar a que el programa termine de ejecutarse antes de continuar con la siguiente instrucción en su script. Si se establece en verdadero, la ejecución del script se detiene hasta que el programa finaliza y Run devuelve cualquier código de error devuelto por el programa. Si se establece en falso (el valor predeterminado), el método Run regresa inmediatamente después de iniciar el programa, devolviendo automáticamente 0 (que no debe interpretarse como un código de error).
145
splattne

¿Estás ejecutando esto como una tarea programada? Si es así, configúrelo para que se ejecute como una cuenta de usuario diferente, entonces no será visible para el usuario conectado. Si el script no necesita acceso a la red a elementos que necesitan autenticación de Windows (como archivos compartidos o impresoras), puede ejecutarlo como "nt Authority\system" y dejar la contraseña en blanco. En Windows 7, simplemente configure el usuario en SISTEMA y presione OK.

(Probablemente tenga que usar un usuario real si está usando robocopy ...)

JR

59
John Rennie

Simplemente configure la Tarea Programada como "Ejecutar si el usuario ha iniciado sesión o no".

29
Peter Meinl

También puedes probar CHP (Crear proceso oculto) , hace exactamente lo que piensas ...

CHP.EXE mybat.bat

Se ejecuta sin ventana de comandos. ¡Perfecto! Hecho por las mismas personas que CMDOW, pero esto es más apropiado.

18
rocketmonkeys

CMDOW es una herramienta impresionante que le permite hacer muchas, muchas cosas en las ventanas desde la línea de comandos.

Una de las cosas más simples es ocultar la ventana actual (generalmente como una primera línea en el archivo bat) con:

cmdow @ /hid

o comenzar un nuevo proceso oculto con

cmdow /run /hid mybat.bat 
9
itsadok

Intenta invocar el script con

start /b <command>
5
rashfeather

Puede crear un acceso directo al archivo por lotes, configurar el acceso directo para que comience a minimizarse (en las propiedades del acceso directo, pestaña 'Acceso directo'), y luego configurar el trabajo para iniciar el acceso directo.

Importante: Deberá especificar la ruta del acceso directo manualmente escribiéndolo en el campo Ejecutar texto, completo con la extensión '.lnk'; si solo intentas buscarlo, servirá para redirigirse a los puntos de acceso directo.

5
Doug Kavendek

Me doy cuenta de que esta pregunta ya ha sido respondida con una resolución perfectamente buena que es nativa de Windows y, por lo tanto, debería ser la más compatible, y estoy completamente de acuerdo.

También quería decir que no estoy de acuerdo con el comentario de @ splattne (pero no con su respuesta real), que la resolución en el otro hilo de referencia merece el crédito. Esa respuesta implica ejecutar el script como un usuario diferente (SYSTEM), que es más o menos el equivalente a dar acceso al script root. También fallará para trabajos como ROBOCOPY (como hace referencia John Rennie), que requieren acceso a la red.

Nunca he probado CMDOW antes, pero me gustaría ofrecer otra resolución similar, que [aunque no está instalada de forma nativa en Windows] sigue siendo altamente portátil para la mayoría de las versiones, y viene en 32 y 64- versiones de bits, y eso es NirCmd .

NirCmd es una herramienta muy poderosa que tiene miles de opciones, la más útil de las cuales, personalmente, considero que es su capacidad para iniciar ventanas de comandos ocultas simplemente ejecutando lo siguiente:

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

Desde la sección exec de La referencia de comando NirCmd :

exec [show/hide/min/max] [application + command-line]

Ejecuta una aplicación y, opcionalmente, especifica uno o más parámetros de línea de comandos para la aplicación ejecutada. El parámetro [show/ hide /min/max] especifica si la aplicación en ejecución será visible o no. Si se especifica 'ocultar', la aplicación en ejecución no será visible para el usuario. Si se especifica 'max', la ventana de la aplicación en ejecución se maximizará. Si se especifica 'min', la ventana de la aplicación en ejecución se minimizará.

EDITAR: Estaba tratando de ejecutar un trabajo ROBOCOPY e intenté el método en esta respuesta, y no funcionó, incluso después de editar Los privilegios de acceso a la red. Intenté hacer doble clic en el script y no pude hacerlo funcionar, pero solo pude ejecutarlo bajo un símbolo del sistema elevado. Creé un acceso directo al archivo por lotes y lo ejecuté como Administrador y pude ejecutarlo haciendo doble clic en él, pero el método con el que terminé fue ejecutarlo oculto como SYSTEM (lo sé, lo sé) - pero funciona con ROBOCOPY, por lo que vale, siempre que el archivo por lotes tenga los permisos correctos.

EDIT 2: Por alguna razón, no funcionaría como SYSTEM (probablemente el elemento de acceso a la red mencionado anteriormente) - Solo noté esto después de ejecutar ROBOCOPY sin el indicador/L, que es básicamente solo una simulación y [aparentemente] en realidad no se conecta al sistema remoto, pero cuando ejecuto el archivo por lotes con los más altos privilegios y marco la casilla oculta, puedo todavía lo ejecuta como el usuario conectado en segundo plano sin que se muestre una ventana de comando, para lo que sea que valga para cualquiera.

1
rubynorails

Otra solución que he usado es Inicio oculto

0
SteveC