Windows XP o Windows posterior: ¿Cómo puedo ejecutar un archivo por lotes en segundo plano sin mostrar ninguna ventana?


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

  • de otro lote,
  • sin ninguna ventana de consola mostrada,
  • 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 (lanzado por el primero de una manera asíncrona ) también muestra una ventana de consola.

Se me ocurrió un script VBScript que hace precisamente eso, y puse el script como respuesta para que otros se refieran a, pero si tiene otras ideas/soluciones, siéntase libre de contribuir.

Nota: La ventana de la consola del procesador de comandos de Windows se llama ventana DOS realmente no correcta por muchas personas.


Gracias a todos por las respuestas. Por lo que entiendo, si necesito llamar asincrónicamente a un script para que se ejecute en un modo:

  • Desde un segundo script ya en una ventana de consola, start /b es suficiente.
  • Desde Windows, sin activar una segunda ventana, mi solución sigue siendo válida.
Author: Community, 2008-11-18

8 answers

¿Necesita que el segundo archivo por lotes se ejecute de forma asíncrona? Normalmente un archivo por lotes ejecuta otro sincrónicamente con el comando call, y el segundo compartirá la ventana del primero.

Usted puede utilizar start /b segundo.bat para lanzar un segundo archivo por lotes a sincrónicamente desde el primero que comparte la ventana del primero. Si ambos archivos por lotes escriben en la consola simultáneamente, la salida se superpondrá y probablemente indescifrable. Además, desea poner un comando exit al final de su segundo archivo por lotes, o estará dentro de un segundo shell cmd una vez que todo esté hecho.

 50
Author: P Daddy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-18 12:48:48

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, estás llamando a un script vbs con:

  • la [ruta]\nombre de su script
  • todos los otros argumentos necesarios para su script (%*)

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

  • intWindowStyle: 0 significa " invisible windows"
  • bWaitOnReturn: false significa que su primer script no necesita esperar a que su segundo script termine

Aquí está invis.vbs:

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    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
 107
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-04 15:34:45

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

 12
Author: Rob Kam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-20 18:22:41

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 programar un conjunto de comandos para ejecutarse periódicamente, por lo que la ventana de DOS sigue apareciendo, aquí está su solución. Utilice un script 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 anteriores en un editor y guarde el archivo con .Extensión VBS. Editar el .Nombre de archivo BAT y ruta en consecuencia.

 8
Author: indago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-04 14:28:32

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

1) El IEXPRESS la solución se puede utilizar incluso en máquinas viejas win 95/98. Iexpress es una herramienta muy antigua que todavía está empaquetada con Windows, ya que arguments solo acepta el comando y sus argumentos.

Ejemplo uso:

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

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

Ejemplo de uso:

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

3) 'WScript.Shell' - el script es un envoltorio completo de ' WScript.Shell ' y todas las opciones posibles pueden se establece a través de la línea de comandos options.It es un híbrido jscript / batch y se puede llamar bat.

Ejemplo de uso (para más información imprimir la ayuda con '-h'):

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

4) 'Win32_ProcessStartup' - de nuevo full wrapper y todas las opciones son accesibles a través de los argumentos de la línea de comandos.Esta vez es híbrido FSM / batch con algunas piezas de código Jscript y VBScript - pero devuelve el PID del proceso iniciado.Si el proceso no está oculto algunas opciones como X/Y se pueden usar coordenadas (no se aplica a todos los ejecutables, pero por ejemplo cmd).exe acepta coordenadas).

Ejemplo de uso (para más información imprimir la ayuda con '-h'):

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

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

Ejemplo de uso (para más información imprimir la ayuda con '-h'):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal
 7
Author: npocmaka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-15 15:21:52

En la otra pregunta sugerí autoexnt. Esto también es posible en esta situación. Simplemente configure el servicio para que se ejecute manualmente (es decir, no de forma automática al iniciar). Cuando desee ejecutar su lote, modifique el autoexnt.bat file para llamar al archivo por lotes que desee e iniciar el servicio autoexnt.

El archivo por lotes para iniciar esto, puede tener este aspecto (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 usuario del sistema, lo que significa que no tiene acceso a la red comparte 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 Kit de recursos también se puede instalar en otras versiones de Windows, como Windows XP.

 2
Author: wimh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-18 13:15:31

Ejecútelo con un nombre de usuario diferente, usando "runas" o programándolo con un usuario diferente en Tareas programadas de Windows.

 2
Author: JosephStyons,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-11-18 14:40:09

Puede ejecutar su .bat file a través de a .vbs file
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 
 0
Author: Vinod Chelladurai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-09 06:30:03