Windows XP o posterior Windows: ¿cómo puedo ejecutar un archivo por lotes en el fondo sin mostrar ventana?

Sé que ya he respondido una pregunta similar ( Ejecutar archivo por lotes en segundo plano cuando Windows se inicia ), pero esta vez necesito iniciar un lote:

  • de otro lote,
  • sin mostrar ninguna ventana de consola,
  • con todos los argumentos pasados ​​al lote invisible.

El primer lote se ejecuta en una ventana de consola. Sin embargo, no quiero que el segundo lote (iniciado por el primero de manera asincrónica ) también muestre una ventana de consola.

He creado una secuencia de comandos de VBScript que hace precisamente eso, y puse el guión como una respuesta para que otros se refieran , pero si tiene otras ideas / soluciones, no dude en contribuir.

Nota: La ventana de la consola del procesador de comandos de Windows se llama una ventana de DOS realmente incorrecta para muchas personas.


Gracias a todos por las respuestas. Por lo que entiendo, si necesito llamar asíncronamente a un script para ejecutarlo en un modo invisible:

  • Desde un segundo script que ya está en una ventana de consola, start /b es suficiente.
  • Desde Windows, sin activar una segunda ventana , mi solución sigue siendo válida.

    ¿Necesita el segundo archivo por lotes para ejecutarse de forma asincrónica? Normalmente, un archivo por lotes se ejecuta de forma síncrona con el comando de call , y el segundo comparte la ventana del primero.

    Puede utilizar start /b second.bat para iniciar un segundo archivo por lotes de forma sincronizada desde el primero que comparte la ventana de su primer usuario . Si ambos archivos de proceso por lotes escriben simultáneamente en la consola, la salida se superpondrá y probablemente será indescifrable. Además, querrá poner un comando de exit al final de su segundo archivo por lotes, o estará dentro de un segundo shell cmd una vez que todo esté hecho.

    Aquí hay una posible solución:

    Desde su primer script, llame a su segundo script con la siguiente línea:

     wscript.exe invis.vbs run.bat %* 

    En realidad, llamas a un script vbs con:

    • el [camino] \ nombre de su script
    • todos los demás argumentos que necesita tu script ( %* )

    Entonces, invis.vbs llamará a su script con el método Windows Script Host Run () , que toma:

    • intWindowStyle: 0 significa “ventanas invisibles”
    • bWaitOnReturn: falso significa que su primer script no necesita esperar a que termine su segundo script

    Aquí está invis.vbs:

     set args = WScript.Arguments num = args.Count if num = 0 then WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat " WScript.Quit 1 end if sargs = "" if num > 1 then sargs = " " for k = 1 to num - 1 anArg = args.Item(k) sargs = sargs & anArg & " " next end if Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False 

    Convierte el archivo por lotes a un exe. Pruebe Bat To Exe Converter o Online Bat To Exe Converter , y elija la opción para ejecutarlo como una aplicación fantasma, es decir, sin ventana.

    Aquí está mi colección de maneras de lograr eso, y aún más, donde fue posible, intenté devolver también el PID del proceso iniciado (todos los scripts enlazados se pueden descargar y guardar con el nombre que considere conveniente):

    1) La solución IEXPRESS se puede usar incluso en máquinas viejas win 95/98. Iexpress es una herramienta realmente antigua que todavía viene empaquetada con Windows, ya que los argumentos solo aceptan el comando y sus argumentos.

    Ejemplo de uso:

     call IEXPhidden.bat "cmd /c myBat.bat" "argument" 

    2) SCHTASKS – Nuevamente acepta solo dos argumentos: el comando y los argumentos. También comprueba si se inició con permisos elevados y, si es posible, obtiene el PID del proceso con WEVTUTIL (disponible desde Vista y arriba para que la versión más nueva de Windows reciba el PID) comando.

    Ejemplo de uso:

     call SCHPhidden.bat "cmd /c myBat.bat" "argument" 

    3) ‘WScript.Shell’ : la secuencia de comandos es un contenedor completo de ‘WScript.Shell’ y todas las opciones posibles se pueden establecer a través de las opciones de línea de comandos. Es un híbrido jscript / batch y se puede llamar como un murciélago.

    Ejemplo de uso (para más información imprima la ayuda con ‘-h’):

     call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

    4) ‘Win32_ProcessStartup’ : de nuevo el wrapper completo y todas las opciones son accesibles a través de los argumentos de la línea de comandos. Esta vez es FSM / híbrido por lotes con algunos JScript y algunas partes de código VBScript, pero devuelve el PID del proceso iniciado. Si el proceso es no oculto algunas opciones como las coordenadas X / Y se pueden utilizar (no aplicable para cada ejecutable, pero por ejemplo cmd.exe acepta coordenadas).

    Ejemplo de uso (para más información imprima la ayuda con ‘-h’):

     call win32process.bat "notepad" -arguments "/A openFile.txt" -showWindows 0 -title "notepad" 

    5) El. Solución NET . Se utilizan la mayoría de las opciones de ProcessStartInfo (pero al final estaba demasiado cansado para incluir todo):

    Ejemplo de uso (para más información imprima la ayuda con ‘-h’):

     call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt" -style Hidden -directory "." -title "notepad" -priority Normal 

    Creo que esta es la solución más fácil y más corta para ejecutar un archivo por lotes sin abrir la ventana de DOS, puede ser muy molesto cuando desea progtwigr un conjunto de comandos para que se ejecuten periódicamente, para que la ventana de DOS siga apareciendo, aquí está su solución . Use una secuencia de comandos VBS para llamar al archivo por lotes …

     Set WshShell = CreateObject("WScript.Shell" ) WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 Set WshShell = Nothing 

    Copie las líneas de arriba a un editor y guarde el archivo con la extensión .VBS. Edite el nombre de archivo .BAT y la ruta en consecuencia.

    En la otra pregunta, sugerí autoexc . Eso también es posible en esta situación. Simplemente configure el servicio para que se ejecute manualmente (es decir, no sea automático al inicio). Cuando desee ejecutar su lote, modifique el archivo autoexnt.bat para llamar al archivo por lotes que desee e inicie el servicio autoexnt.

    El archivo por lotes para comenzar esto, puede verse así (no probado):

     echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat net start autoexnt 

    Tenga en cuenta que los archivos por lotes iniciados de esta manera se ejecutan como el usuario del sistema, lo que significa que no tiene acceso a recursos compartidos de red automáticamente. Pero puede usar net use para conectarse a un servidor remoto.

    Tienes que descargar el Kit de recursos de Windows 2003 para obtenerlo. El Resource Kit también se puede instalar en otras versiones de Windows, como Windows XP.

    Ejecútelo con un nombre de usuario diferente, utilizando “runas” o programándolo con un usuario diferente en Tareas progtwigdas de Windows.

    Puede ejecutar su archivo .bat a través de un archivo .vbs
    Copie el siguiente código en su archivo .vbs:

     Dim WshShell Dim obj Set WshShell = WScript.CreateObject("WScript.Shell") obj = WshShell.Run("C:\Users\file1.bat", 0) obj = WshShell.Run("C:\Users\file2.bat", 0) and so on set WshShell = Nothing