Ejecute un archivo por lotes de forma completamente oculta

139

Estoy buscando alguna forma de ejecutar un archivo por lotes (.bat) sin nada visible para el usuario (sin ventana, sin nombre de barra de tareas, .etc ..).

No quiero usar algún programa para hacer eso, estoy buscando algo más limpio. He encontrado una solución que usa VBScript, pero tampoco me gusta mucho usar VBS.

Moayad Mardini
fuente
¡Jaja! Definitivamente no. Estoy desarrollando un servicio de Windows que ejecutará un archivo por lotes de vez en cuando.
Moayad Mardini
44
Los servicios de Windows no se ejecutan como archivos por lotes. Se ejecutan como servicios. Necesita aclarar la pregunta, tal como está escrita y con comentarios, no tiene sentido para mí.
CarlF
1
Tengo un servicio de Windows que ejecuta archivos por lotes. No es que el servicio sea un archivo por lotes.
Moayad Mardini
1
¿En qué idioma escribe su servicio?
Hugh Allen
Hay hstart también.
barlop

Respuestas:

119

Solución 1:

Guarde esta línea de texto como archivo invisible.vbs:

CreateObject ("Wscript.Shell"). Ejecute "" "" & WScript.Arguments (0) & "" "", 0, False

Para ejecutar cualquier programa o archivo por lotes de forma invisible, úselo de esta manera:

wscript.exe "C: \ Donde sea \ invisible.vbs" "C: \ Algún otro lugar \ MyBatchFile.bat"

Para poder también transmitir / transmitir una lista de argumentos, use solo dos comillas dobles

CreateObject ("Wscript.Shell"). Ejecute "" & WScript.Arguments (0) & "", 0, False

Ejemplo: Invisible.vbs "Kill.vbs ME.exe"

Solución 2:

Utilice una herramienta de línea de comandos para iniciar un proceso de forma silenciosa : Quiet , hidecon u hideexec .

harrymc
fuente
2
¿Por qué 4 comillas dobles, podría explicar?
Starx
¿Qué pasa si necesitáramos iniciar un programa oculto?
Starx
55
Sintaxis de @Starx VB. &significa concatenar cadenas. Las cadenas están entre comillas dobles ( "). Las comillas dobles consecutivas ( "") dentro de los delimitadores de cadena significan una comilla doble literal ( "). Entonces, cuatro comillas dobles ( """") serían una cadena literal de un carácter, una comilla doble ( "). Póngalo junto, y """" & WScript.Arguments(0) & """"se convertiría "<argument>", donde <argument>está el primer argumento de línea de comando pasado al script.
Bob
44
¿Cómo modificarlo para que pase todos los argumentos? Sería más conveniente pasar los argumentos sin citarlos.
Ctrl-C
2
¿Esto aún no requiere que crees un archivo por lotes para poner el wscript.exe "C:\Wherever\invisible.vbs" ...interior?
endolito
26

Para ocultar archivos por lotes o archivos de comandos o cualquier archivo ... Utilice la IExpress.exeutilidad integrada de Windows XP para crear un .EXE a partir del archivo por lotes. Cuando lo use, IExpressasegúrese de marcar la opción Ejecutar oculta y marque todas las casillas sobre no mostrar nada. Después de crear su .exe, colóquelo en la carpeta de comandos de ejecución que elija y nunca lo verá aparecer.

Paul Cheselske
fuente
1
Oh, buena solución en realidad.
Camilo Martin
77
¿Hay algo equivalente a lexpress.exe en las nuevas versiones de Windows como Windows 7?
Sanađошƒаӽ
@ Sнаđошƒаӽ Está en Windows 7 ... acabo de probarlo
DarthRubik
@DarthRubik Gracias por compartir eso. Yo también lo probé y funciona bien. Es hora de votar la respuesta. :)
Sнаđошƒа 5
Esto no parece funcionar en Windows 10 64 ya que "Command.com" ya no parece estar presente
Arne S
10

use Cmdow es una utilidad de línea de comandos Win32 para NT4 / 2000 / XP / 2003 que permite que las ventanas se enumeren, muevan, cambien de tamaño, cambien de nombre, oculten / oculten, deshabiliten / habiliten, minimicen, maximicen, restauren, activen / desactiven, cierren, eliminen y más.

Ejecute un archivo por lotes oculto pasándolo parámetros: -

cmdow / run / hid mybat arg1 "arg 2"

joe
fuente
Pero, ¿cómo ejecutaría este comando?
Moayad Mardini
99
cmdow es detectado como un malware por la mayoría de los productos antivirus. Por lo tanto, sería difícil usar esta solución en lugares que no sean su propia PC.
Ganesh R.
@Ganesh: ¿Alguna mejor solución?
Moayad Mardini
¿Es de código abierto? No tiene sentido usar una aplicación de terceros que no sea de código abierto y que pueda estar empacando troyanos cuando podría hacer lo mismo ejecutando vbscript de 1 línea de harrymc (vea la respuesta en la parte superior del hilo).
thebunnyrules
1
Bueno, es de código abierto, así que es bastante impresionante. Puede obtener el código fuente aquí: github.com/ritchielawrence/cmdow
thebunnyrules
9

Si su archivo por lotes puede caber en una línea y tantos caracteres, simplemente use un acceso directo haciendo clic derecho dentro de una carpeta colocada en un directorio aleatorio, y salte el resto del asistente, y finalmente haga clic derecho en el acceso directo que acaba de crear y haga clic en propiedades y, debajo del objetivo, ingrese lo que normalmente colocaría en un archivo bat. Y Bobs tu tío!

Pros:

 No Command Window
 Ability to use an icon
 Same Functionality of bat file

Contras:

 Limited to one line, so many characters
Jack S
fuente
El único problema es que no puede asociar un tipo de archivo con un acceso directo. Entonces, si desea abrir una secuencia de comandos por lotes haciendo doble clic en ella en el explorador, aún necesita un archivo .bat.
Björn Lindqvist
¡Todavía estoy tratando de encontrar al tío Bob, está aquí por todas partes!
Pimp Juice IT
7

Ejecute el script a través de un en el trabajo sin hacerlo interactivo:

at 11:00 script.bat

Otra solución, si no le importa instalar algo como Python, simplemente puede crear un script y ejecutarlo pythonw(la versión vinculada para las operaciones GUI). Como no está utilizando ninguna API gráfica, la ventana no se mostrará. Simplemente use llamadas a os.system()e imitará un script por lotes, ya que es lo mismo que escribir las cadenas en la línea de comando.

Ejemplo:

import os

os.system("tasklist > C:\tasks.txt")
os.system("ipconfig /all > C:\netinfo.log")
John T
fuente
3
Pero, ¿cómo ejecutaría este comando?
Moayad Mardini
Tendría que programar una tarea programada o escribir un servicio.
Unfundednut
ejemplos añadidos.
John T
6

Puede ejecutarlo minimizado fácilmente.

start /MIN batch.cmd
Brad Gilbert
fuente
3
o use / B en su lugar!
rany
6

Con Windows7, puede usar el panel de control "Tarea programada" para programar un archivo por lotes para que se ejecute en segundo plano de forma invisible con los permisos especificados e incluso como la cuenta "SISTEMA". Ver captura de pantalla a continuación:

ingrese la descripción de la imagen aquí

Además, aunque no tiene tantas capacidades, también puede crear una tarea invisible de secuencia de comandos por lotes como esta desde la línea de comandos utilizando el comando "AT.exe" sin la opción '/ interactive'.

djangofan
fuente
3
La casilla de verificación oculta solo oculta la tarea desde la interfaz de usuario del Programador de tareas (
Sourav Ghosh
Ejecutar una tarea como "SISTEMA" cuando no necesita privilegios de "SISTEMA" (y no ha sido analizado en busca de debilidades de seguridad y endurecido) como una mala idea; Mira los comentarios aquí .
Scott
6

No me gusta la solución VBScript.

Descargue y copie nircmd.exe en su %systemroot%\system32carpeta, luego agregue este comando a la primera línea de su lote:

nircmd.exe win hide ititle "cmd.exe"

o haga su título de lote personalizado primero con el titlecomando para evitar ocultar todas las cmdventanas, de esta manera:

title MyBatch
nircmd.exe win hide ititle "MyBatch"
BijaN-R
fuente
Utilizo este método exacto, pero fallé durante un tiempo en que nircmd no oculta la ventana cmd, solo se minimiza en la barra de tareas y no se puede restaurar haciendo clic en ella. No sé por qué ...
James Yang
3

También puede crear un script de AutoHotkey :

#NoTrayIcon ; To prevent momentary icon pop-up
run whatever.bat arg1 arg2,,hide 
endolito
fuente
3

AÚN OTRA manera, desde C / C ++, es usar la función CreateProcess con el indicador CREATE_NO_WINDOW. Tiene mucha potencia extra que no se muestra aquí. Esto es solo el mínimo que necesita para reemplazar system () o la familia _spawn ().

STARTUPINFO si;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);

PROCESS_INFORMATION pi;
ZeroMemory( &pi, sizeof(pi) );

// Spawn creates a cmd.exe window.  CreateProcess doesn't.
//if ( _spawnl( _P_WAIT, szFileNameBAT, szFileNameBAT, NULL ) ) {  
if ( !CreateProcess( szFileNameBAT, szFileNameBAT, NULL, NULL, false,
                     CREATE_NO_WINDOW, NULL, NULL, &si, &pi  ) ) {
  MyErrorFunc( "CreateProcess( \"%s\" ): %d", szFileNameBAT, GetLastError() );
  goto MyErrorHandling;
}

WaitForSingleObject( pi.hProcess, INFINITE );

CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
Franco suizo
fuente
1
Respuesta correcta para el enfoque WINAPI. Aquí está el código fuente y la aplicación como complemento a su respuesta.
Alex
3

La excelente Bat to EXE Converter convertirá su .bato .cmdun archivo a un .exearchivo.

Tiene una interfaz de usuario simple. Puede elegir no tener una ventana de consola seleccionando la opción "Aplicación invisible". Además, le permite asignar un icono, paquete de archivos asociados y varias otras opciones.

Aquí hay una captura de pantalla de la ventana principal de la interfaz:


Tenga en cuenta que esta imagen está desactualizada. Muestra la versión 2.4.8 y, a partir de septiembre de 2018, el sitio web ofrece la versión 3.0.10.0 (última actualización 2018-03-23).

Advertencia: el sitio web www.f2ko.de enlaza coinhive.com, que se identifica ampliamente como malware .

BullyWiiPlaza
fuente
2

Lo hice con éxito con nircmd de esta manera:

  1. descargue nircmd.exe desde el enlace
  2. crea tu archivo .bat
  3. La primera línea del archivo .bat tiene que ser esta: nircmd.exe win hide ititle "cmd.exe"
  4. seleccione ambos archivos y cree un archivo autoextraíble usando winrar
  5. en la pestaña "general", marque la casilla "crear archivo de extracción automática"
  6. en la pestaña "avance" seleccione el botón "autoextraer"
  7. hay una nueva ventana y selecciona la pestaña "modo" y luego selecciona la opción: "ocultar todo"
  8. seleccione la pestaña "actualizar" y seleccione la opción "sobrescribir archivos existentes"
  9. Seleccione la pestaña "general" y defina una carpeta de destino para la extracción si lo desea y en el cuadro "Ejecutar después de la extracción" escriba la ruta completa donde se extraerá su .bat. Ej: si define la carpeta de extracción como: "c: \ windows \", la ruta completa para ejecutar después de la extracción será: "c: \ windows \ file.bat" (en el caso de que su .bat se llame: file.bat )
  10. haga clic en aceptar en todas las ventanas

Ahora tendrá un archivo .exe que después de hacer doble clic en él e instalarlo, su .bat se ejecutará totalmente oculto.

ZEUS
fuente
1
cmdow /run /hid "file.extention" arg1 "arg 2"
malak
fuente
3
Incluya una breve explicación del comando. Eso podría ayudar al OP (y a otros) a comprender cómo funciona en lugar de simplemente copiar el comando y usarlo.
BloodPhilia
'cmdow' is not recognized as an internal or external command, operable program or batch file.
Bacco
1

No necesitas hacer nada especial.

Si está ejecutando los archivos por lotes desde un servicio de Windows, deben estar ocultos de manera predeterminada a menos que habilite la opción "Permitir que el servicio interactúe con el escritorio" en el servicio.

sgmoore
fuente
1

Agregué mi respuesta aquí desde otra publicación, ya que era un duplicado y no veo esta solución aquí, así que ahora hay 17 respuestas diferentes sobre cómo puede ejecutar un archivo por lotes oculto. Eliminaré mi respuesta en esa publicación en algún momento en el futuro cercano.

Crear la secuencia de comandos por lotes con la lógica de comandos por lotes y en ella, y luego crear un nuevo archivo con .VBSla extensión, utilizar la lógica continuación (ejemplo I proporciona a continuación) y sólo tiene que conectar la ruta completa a su .CMDo .BATpresentar ante el PING -t <IPAddress>, etc. comandos para ejecuta el lote de forma oculta, no muestra la ventana de comandos cuando se ejecuta.

Donde la lógica en el ejemplo a continuación especifica el C:\Folder\BatchFileName.cmdcambio para que apunte al script por lotes con sus comandos que está ejecutando manualmente, etc. ahora.

Guarde el .VBSarchivo y prográmelo con Task Scheduler Problemas al programar una tarea en windows7 para que se ejecute en un horario indefinido para sus necesidades.

De lo contrario, simplemente haga doble clic en el .VBSarchivo para ejecutar el PINGcomando infinito que puso en el archivo por lotes al que lo señala según sea necesario.

NOTA: Creo que esto es donde me dieron esta lógica secuencia de comandos desde pero funciona de forma fiable con el mismo propósito que necesita aquí es asegurar la ventana de comandos está oculto cuando un archivo por lotes se ejecuta Fuente servidor falla

EJEMPLO VBS SCRIPT RUN COMMAND LINE BATCH HIDING CMD WINDOW

Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Folder\BatchFileName.cmd" & Chr(34), 0
Set WinScriptHost = Nothing
Pimp Juice IT
fuente
1

Aquí he compilado todas las formas que sé para iniciar un proceso oculto con lotes sin herramientas externas. Con scripts listos para usar (algunos de ellos bastante ricos en opciones), y todos ellos forman la línea de comandos. Donde es posible también Se devuelve PID. Las herramientas utilizadas son IEXPRESS, SCHTASKS, WScript.Shell, Win32_Process y JScript.Net

npocmaka
fuente
1

A pesar de que ya respondí esto, aquí hay otro enfoque. Lo diferente aquí es que el script por lotes puede ocultarse automáticamente durante su ejecución. Sin embargo, necesitará dos scripts adicionales: windowMode.bat y getCMDPid.bat (ambos contienen .netcódigo). A continuación, cómo se puede usar:

@echo off
call getCmdPid
call windowMode -pid %errorlevel% -mode hidden

echo this should be written into log despite the cmd window is hidden>log
echo ending the log>>log
exit
npocmaka
fuente
0

Tuve el mismo problema, pero lo descubrí:
Shell("filehere" & "parametersforbatchfilehere", vbHidden)

Alan Panayotov
fuente
0

Empecé a tratar de resolver esto y nunca tuve éxito. Esto fue lo más cerca que llegué:

@echo off
if not defined PIL (
    set PIL=1
    start /min "" %~0
    exit /b
)
TITLE Hello World
echo Hello world!
pause>nul
djangofan
fuente
0

Necesitaba ocultar la ventana para un archivo por lotes llamado desde un menú contextual del explorador, y también necesitaba agregar comillas en el parámetro. Ninguna de las respuestas funcionó para mí, así que estoy agregando mi propia solución.

Tenía esto en el "comando" del registro para un menú contextual del explorador:

cmd /c C:\mypath\myprogram.bat "%1"

Entonces, para reemplazarlo, tuve que crear un vbs como este:

WScript.CreateObject ("WScript.shell").run "cmd /c C:\mypath\myprogram.bat """ & WScript.Arguments(0) & """", 0, False

Guarde en un lugar como C:\mypath\myscript.vbsy llámelo así en el registro:

wscript "C:\mypath\myscript.vbs" "%1"

Tenga en cuenta que la ruta .bat no puede tener espacios, así que reemplácela con el nombre de archivo 8.3. Entonces, por ejemplo C:\Program Files\myprogram.bat, debe ser referenciado como C:\Progra~1\myprogram.bat. Para ver el nombre de archivo 8.3 usedir /x

bortao
fuente
0

Estoy creado EjecutarAplicación para hacer un trabajo tal y usarlo en mi env producción, espero que sea ayuda.

La configuración como a continuación:

archivo: config.arg

:style:hidden

MyBatchFile.bat
arg1
arg2

Y lanzar en su runapp.exelugar.

James Yang
fuente
-1

Esto funciona para Windows 8 (posiblemente otros)

  1. Cree un archivo por lotes de forma normal
  2. Crear un acceso directo al archivo por lotes
  3. Haga clic derecho en el acceso directo> propiedades
  4. Haga clic en diseño
  5. Desmarque "Dejar ventana de posición del sistema"
  6. establecer posición izquierda tp -1000
  7. haga clic en aplicar

  8. Haga clic en el acceso directo y se ejecutará, pero no lo verá :)

Andrés
fuente
44
De Verdad? ¿Esto no se mostrará como un botón en la barra de tareas?
Scott