Pregunta Ejecutar un archivo .bat en una tarea programada sin una ventana


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

Logré que la ventana apareciera minimizada haciendo que se ejecutara el trabajo programado

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 la cadena y luego termina" - Debo haber entendido mal los documentos.

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


139
2018-05-17 09:00


origen


Encontré esta una respuesta más preferible stackoverflow.com/questions/6568736/… - Efekt


Respuestas:


Podrías ejecutarlo silenciosamente usando un archivo de Windows Script en su lugar. 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 programalo El segundo argumento en este ejemplo establece el estilo de la ventana. 0 significa "ocultar la ventana".

Sintaxis completa de la Método de ejecución:

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

Argumentos:

  • objeto: objeto WshShell.
  • strCommand: valor de cadena que indica la línea de comandos que desea ejecutar. Debe incluir todos los parámetros 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 declaración en su script. Si se establece en verdadero, la ejecución del script se detiene hasta que el programa finaliza, y Ejecutar devuelve cualquier código de error devuelto por el programa. Si se establece en falso (el valor predeterminado), el método Ejecutar regresa inmediatamente después de iniciar el programa, devolviendo automáticamente 0 (no debe interpretarse como un código de error).

142
2018-05-17 09:08



+1, acabo de escribir exactamente lo mismo - Sam Cogan
Lo vi antes de que lo borraras. Supongo que los dos somos bots. ;-) - splattne
Nombre de usuario, honestamente creo que Sam lo merece mucho más que yo. ¡Pero gracias de todas maneras! Y no me mencione a mí ni a Jon Skeet en la misma frase. ¡Eso es blasfemia! ;-) - splattne
A la pregunta "¿Hay una forma de ejecutar un script por lotes sin que aparezca una ventana cmd?", Ofrece una respuesta muy directa: ejecútelo utilizando un archivo de Windows Script. - Mark Meuer
@Lee, supongo que las comillas dobles son necesarias si su ruta contiene espacios. - splattne


¿Está ejecutando esto como una tarea programada? Si así lo configura para que se ejecute como una cuenta de usuario diferente, entonces no será visible para el usuario que inició sesión. Si la secuencia de comandos no necesita acceso de red a los elementos que necesitan autenticación de Windows (como archivos compartidos o impresoras), puede ejecutarla como "nt authority \ system" y dejar la contraseña en blanco. En Windows 7, simplemente configure el usuario en SISTEMA, y presione OK.

(Probablemente tengas que usar un usuario real, aunque si estás usando robocopy ...)

JR


55
2018-05-17 09:13



Gracias, esto fue menos molesto para mí que la opción .vbs. - mackenir
Configuré el usuario "Ejecutar como" en SISTEMA (que luego cambió o NT AUTHORITY \ SYSTEM) y funcionó para mí. Ya no veo la ventana emergente de CMD cuando se ejecuta mi tarea programada. ¡Gracias! - Ryan Stille
+1, esto es elegante. Asegúrese de ingresar "sistema" como nombre de usuario, luego win7 hace el resto por usted. Tenga en cuenta que TIENE acceso a la red a Internet, pero no a los recursos compartidos de la red ni a las cosas que necesitan la autenticación de Windows. - samsmith
Usuario del sistema es simple y elegante, gran TIP! +1! - Matteo Conta
Ver Implementando Modelos Administrativos de Mínimo Privilegio. ¿Es el uso de la cuenta del sistema una violación de las políticas de privilegios mínimos? Si es así, entonces los administradores deben saber no hacer esto en la mayoría de las situaciones. - user34660


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


27
2017-10-04 20:06



¡Perfecto! ¡Incluso puede deshabilitar el almacenamiento de credenciales y esto termina siendo más seguro que tener el SISTEMA ejecutándolo! - binki


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

CHP.EXE mybat.bat

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


17
2017-07-20 21:54



Funciona perfectamente cuando necesita ejecutar la tarea en el contexto del usuario que ha iniciado sesión ("Activar: al conectarse a la sesión de usuario", "Ejecutar tarea como: Usuarios") - Sergei
Esto no es una herramienta incorporada - Jonny Leeds


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

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

cmdow @ /hid

o inicia un nuevo proceso oculto con

cmdow /run /hid mybat.bat 

9
2018-05-17 11:30



Tanto esta como la sugerencia de Rocketmonkeys implican la descarga de nuevas herramientas, lo que significa una mayor compatibilidad en los escritorios de varias personas. El horneado, usando comandos de Windows es mucho mejor. - IanVaughan
Plus cmdow es detectado como "peligroso" por algunos programas antivirus (es no peligroso, pero la detección puede causar algunos problemas si el archivo cmdow está en cuarentena ...). - Otiel
Todavía hay una consola emergente, simplemente flashear muy rápido. - Bamboo


Intenta invocar el script con

start /b <command>

5
2018-05-17 14:54



Esto no funciona, la Tarea programada-> Estado indica "No se pudo iniciar", eso es con: start / b C: \ file.bat: and: start / b "C: \ file.bat": pero: C: \ file.bat: funciona bien. - IanVaughan
Porque start No es un programa, es un comando. Necesitas especificar cmd como el programa para ejecutar y /c start /b <file> como el argumento. Sin embargo, esto todavía no va a funcionar porque aún creará una ventana de consola para cmd y parpadea una ventana negra en la pantalla. - Synetech
También puede confirmar con @Synetech que esto no creará una nueva ventana, pero aún necesita tener una ventana de consola abierta para iniciarla. De hecho, este es un comando útil, pero no se puede usar como se solicita con las tareas programadas. - JonathanDavidArndt


Puede crear un acceso directo al archivo por lotes, configurar el acceso directo para que comience de forma minimizada (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 al acceso directo manualmente escribiéndolo en el campo de texto Ejecutar, completo con la extensión '.lnk'; Si solo tratas de buscarlo, lo hará. servicialmente redirigirse a lo que apunta el acceso directo.


5
2017-08-11 16:49



Esto no funciona en Windows 10 x64, da una ventana emergente "¿Cómo desea abrir este archivo?" - Jan