¿Cómo ejecutar un archivo por lotes sin iniciar una "ventana de comandos"? [duplicar]

131

Esta pregunta ya tiene una respuesta aquí:

En Windows XP, ¿puedo ejecutar un archivo por lotes (.bat o .cmd), a través de un acceso directo, sin una "ventana negra"?

dugres
fuente
66
¿Está preguntando si puede evitar que aparezca la ventana de comandos cuando ejecuta un archivo bat?
Eric
66
Sí, puede cambiar fácilmente el color predeterminado de la ventana de salida utilizando las Propiedades en un acceso directo cmd.exe. (sí, esto es una broma ...)
Toby J

Respuestas:

86

Guarde lo siguiente como wscript, por ejemplo, hidecmd.vbs después de reemplazar "testing.bat" con el nombre de su archivo por lotes.

Set oShell = CreateObject ("Wscript.Shell") 
Dim strArgs
strArgs = "cmd /c testing.bat"
oShell.Run strArgs, 0, false

El segundo parámetro de oShell.Runes el intWindowStylevalor que indica la apariencia de la ventana del programa y el valor cero es para la ventana oculta.

La referencia está aquí http://msdn.microsoft.com/en-us/library/d5fk67ky.aspx

Sharjeel Aziz
fuente
¿Sería la tercera línea: strArgs = "cmd / c FILEPATH \ testing.bat"?
Dan Z
1
¿Alguna forma de ejecutar el bate en modo elevado sin dejar de ser invisible?
Laurens Swart
¿Cómo ejecutar el .batarchivo como administrador o usando este método?
Mehdi Dehghani
44

Esto es solo una simplificación de la respuesta de Shaji. Puede ejecutar su script por lotes a través de un script VBScript (.vbs) como este:

'HideBat.vbs
CreateObject("Wscript.Shell").Run "your_batch_file.bat", 0, True

Esto ejecutará su archivo por lotes sin mostrar ninguna ventana de comandos.

gran lobo
fuente
¿Cómo ejecutar el .batarchivo como administrador con este método?
Mehdi Dehghani
Propiedades de @MehdiDehghani> seguridad> ejecutar como administrador. Si eso solo funciona para exe o aplicaciones, entonces bueno.
TaylorS
21

Solo para ampliar las respuestas "Usar secuencias de comandos de Windows" (que considero mejor porque ya está integrado), aquí se explica cómo hacerlo mediante el uso de una secuencia de comandos de envoltura única y pasando el nombre del archivo por lotes "real" como parámetro. Se pasarán parámetros adicionales al archivo por lotes.

If WScript.Arguments.Count >= 1 Then
    ReDim arr(WScript.Arguments.Count-1)
    For i = 0 To WScript.Arguments.Count-1
        Arg = WScript.Arguments(i)
        If InStr(Arg, " ") > 0 Then Arg = """" & Arg & """"
      arr(i) = Arg
    Next

    RunCmd = Join(arr)
    CreateObject("Wscript.Shell").Run RunCmd, 0, True
End If

Entonces, por ejemplo, guarde el archivo anterior como en NoShell.vbsalgún lugar y luego llame:

NoShell.vbs c:\foo\my_batch_file.bat

Finalmente, si está buscando ejecutar esto desde algún lugar que no entienda el archivo .vbs (como "Herramientas externas" en Visual Studio), querrá llamar C:\Windows\System32\wscript.execon el archivo vbs como primer parámetro y su archivo por lotes como el segundo.

Toby J
fuente
66
Para aquellos a los que no les gusta la idea y el concepto de tener que crear un nuevo archivo vbs para cada nuevo archivo bat que uno cree, ya que uno debe usar cualquiera de las dos respuestas principales, esta es la solución perfecta. En lugar de múltiples archivos vbs, tendrá múltiples accesos directos. Para cada nuevo archivo bat, cree un acceso directo del archivo vbs, haga clic derecho sobre él, elija propiedades> pestaña Accesos directos, y en el cuadro Destino ingrese la ruta del archivo bat después de la ruta que ya está allí, tal como se muestra arriba o como esto si el acceso directo no está en el mismo lugar que el archivo VBS: "C:\My Files\HideCmd.vbs" c:\foo\my_batch_file.bat.
Rolo
Si la ruta del archivo bat tiene un espacio, ¿cómo se puede llamar a través de un acceso directo al archivo vbs? Por ejemplo: "C:\My Files\HideCmd.vbs" c:\my things\my_batch_file.bat. No importa lo que intente para el camino: comillas dobles alrededor de todo,% 20 en lugar del espacio, o una combinación de esos dos, nada funciona. Recibo un mensaje de error que me dice que no se puede encontrar el archivo o que no sucede nada. ¿Esto se debe a un error del usuario de mi parte, una limitación de Windows con el campo Destino para accesos directos o un problema con el script vbs en el que no maneja las rutas de archivos con espacios correctamente?
Rolo
@Rolo He actualizado el script para que si alguno de los parámetros entrantes tiene espacios, los rodeará con comillas. Por lo tanto, querrá ajustar la ruta al archivo por lotes con comillas cuando lo llame, luego se considerará un argumento único y se volverá a ajustar antes de ser llamado.
Toby J
9

Puede cambiar las propiedades del acceso directo para ejecutar minimizado.

Para ejecutarlo de forma completamente invisible, necesitará algo más, como Windows Scripting.

cerveza inglesa
fuente
1
Su primera sugerencia es la forma en que siempre lo he hecho.
Martineau
8

Use comenzar con la opción '/ B'. Por ejemplo:

@echo off
start /B go.bat
zaf
fuente
25
start /bsolo ejecutará el programa en la consola actualmente asignada en lugar de generar una nueva. Obtendrá uno nuevo de todos modos ya que el lote debe ejecutarse con cmd (que, a su vez [sorpresa], abre una consola).
Joey
@Joey sí, pero esto es muy útil para iniciar archivos por lotes desde otras aplicaciones a través de la ejecución de shell (como SYSTEMen C / C ++).
Tomáš Zato
1
@ TomášZato: puede llamar al archivo por lotes directamente en ese caso o, si lo que usa para generar un proceso no crea un shell primero, use cmd /c foo.cmd. No hay absolutamente ninguna necesidad de usar starten esos escenarios, y diría que systemno debería usarse a favor CreateProcess. Al iniciar un archivo por lotes, ya depende de una plataforma, también podría usar las mejores herramientas para el trabajo.
Joey
@Joey Muchas gracias, nunca había escuchado cmd /cantes. El comando cmd es lo que se necesita en mi caso, pero todas las respuestas que Stackexchange encontrado hasta ahora, acerca de un archivo por lotes se ejecuta otro archivo por lotes, tienen respuestas más a usar el inicio ...
T_D
start /b go.bat no asignará una nueva consola (es decir, una instancia de conhost.exe, o un hilo en csrss.exe antes de Windows 7). Sin embargo, hará un desastre ya que el script por lotes se ejecuta con una nueva instancia de cmd.exe que está conectada a la misma consola . Ambas instancias del shell competirán para leer la entrada de la consola, generalmente alternando. Necesita /w(por ejemplo start /b /w go.bat) para esperar en la segunda instancia, que es similar a usar cmd /cif using system. Además, si llama CreateProcess, ejecute go.batdirectamente. No hay necesidad de eso cmd /c.
Eryk dom
6

Código abierto gratuito de GPL "Crear proceso oculto"

http://www.commandline.co.uk/chp/

Microsoft Security Essentials, y probablemente la mayoría de los otros escáneres de virus / malware tratarán el ejecutable, chp.exe, como un virus porque oculta cualquier programa que especifique para mostrar una ventana o un botón de la barra de tareas, al igual que los virus.

No es un virus. No oculta que el proceso de destino aparezca en el administrador de tareas, por ejemplo. Y, por supuesto, el código fuente está incluido para que pueda ver que es muy pequeño y no hace nada más que ejecutar cualquier programa que le dé.

Ni siquiera tiene que confiar en que el chp.exe incluido realmente se creó a partir de esa fuente. Puede continuar y descartar el chp.exe incluido y compilar el suyo desde la fuente, y todas las herramientas necesarias para hacerlo son incluso gratuitas y descargables.


También puede hacer un acceso directo al archivo .bat o .cmd, luego hacer clic derecho en el acceso directo, Propiedades, pestaña Acceso directo, Ejecutar: minimizado. Luego, en las tareas programadas, use el acceso directo en lugar del archivo .bat / .cmd directamente. Eso evitará que aparezca una ventana, pero aún aparecerá un botón de la barra de tareas.

bkw
fuente
6

Puede usar secuencias de comandos de ventana como AutoIt .

Como ejemplo, solo escriba esto en el editor de script AutoIt. Es bastante simple

Run("C:\test\batchfile.bat", "", @SW_HIDE)

Si quieres ejecutarlo en un bucle,

$x=0
Do
 Run("C:\test\batchfile.bat", "", @SW_HIDE)
 Sleep(5000)
Until $x = 1

Compílelo como .exe, y ya está.


Del mismo modo, en AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
Adrian Yeoh
fuente
5

Use Hidden Start (cuesta $ 20)

Inicio oculto: ejecute aplicaciones y archivos por lotes sin una ventana de consola o indicador de UAC

Las aplicaciones de consola y los archivos por lotes se ejecutan regularmente al inicio de Windows o en un horario. El principal inconveniente de esto es que cada aplicación abre una ventana de consola que parpadea en la pantalla. Hidden Start (o Hstart) es una utilidad de línea de comandos liviana que le permite ejecutar aplicaciones de consola y archivos por lotes sin ninguna ventana en segundo plano, manejar la elevación de privilegios UAC en Windows 7 y Vista, iniciar múltiples comandos en paralelo o sincrónicamente, y mucho más .

ingrese la descripción de la imagen aquí

Kyle A
fuente
Esta es una aplicación muy bien diseñada y útil.
Guru Josh
5

Solución simple, sin usar ningún programa adicional.

  1. Cree el archivo por lotes que desea ejecutar y pruébelo.
  2. Crea un atajo para ello.
  3. Edite las propiedades del acceso directo: en la pestaña Acceso directo, elija Ejecutar minimizado. ¡Asigne una tecla de acceso rápido y listo!

¡Buena suerte!

Willem
fuente
77
Esta no es una solución para el problema del OP. Hay una diferencia entre minimizar y ocultar
nixda
Si cambia el acceso directo para usar el icono correcto, la salpicadura minimizada en la barra de tareas es en realidad un buen recordatorio de que algo está comenzando.
Quien sea el
¡Esa es una solución agradable y limpia para mi problema! ¡Gracias!
dmitry_romanov
minimizando ... jeje.
gumuruh