ventana silencioso pantalla ocultar negra ejecutar desde crear bat automaticamente archivo windows cmd

windows - silencioso - hide cmd window



Detectar si el archivo bat se está ejecutando con un doble clic o desde la ventana de cmd (10)

Tengo un archivo bat que hace un montón de cosas y cierra la ventana de cmd, lo cual está bien cuando el usuario hace doble clic en el archivo bat desde el explorador. Pero si ejecuto el archivo bat desde una ventana cmd ya abierta como en cmd> c: / myfile.bat, entonces no quiero que el archivo bat cierre la ventana cmd (FIN) ya que necesito hacer otras cosas. Necesito el código de comando bat dos que hará algo como

if (initiated_from_explorer) then else endif

Es posible ? Gracias


@dlchambers estuvo cerca, pero el conjunto no funcionó ya que cmdcmdline no es una variable de entorno definida en algunos casos, pero esta versión basada en su trabajo es excelente para mí:

echo %cmdcmdline% | findstr /i pushd >nul if errorlevel 1 pause


Al igual que @anishsane, yo también quería una declaración de pausa si se iniciaba desde el explorador, pero no cuando se iniciaba desde una ventana de comandos.

Esto es lo que funcionó para mí, basado en la respuesta de @ mousio anterior:

@SET cmdcmdline|FINDSTR /b "cmdcmdline="|FINDSTR /i pushd >nul @IF ERRORLEVEL 1 ( @echo. @echo Press ENTER when done @pause > nul )

(Nada original aquí, solo proporciona un ejemplo de trabajo)


Después de leer las sugerencias, esto es lo que hice con:

set __cmdcmdline=%cmdcmdline% set __cmdcmdline=%__cmdcmdline:"=% set __cmdcmdline=%__cmdcmdline: =% set __cmdcmdline=%__cmdcmdline:~0,5% if "%__cmdcmdline%"=="cmd/c" set CMD_INITIATED_FROM_EXPLORER=1 set __cmdcmdline=

que establece condicionalmente la variable: CMD_INITIATED_FROM_EXPLORER

..y posteriormente puede ser utilizado según sea necesario:

if defined CMD_INITIATED_FROM_EXPLORER ( echo. pause )

..pero el problema relacionado con Powershell que menciona @Ruben Bartelink no está resuelto:

ejecutar ./batch.cmd desde Powershell usa cmd /c debajo del capó


La solución de "mousio" es agradable; sin embargo, personalmente no logré hacerlo funcionar en una declaración "SI" debido a las comillas dobles en el valor de %cmdcmdline% (con o sin comillas dobles alrededor de %cmdcmdline% ).

Sin embargo, la solución que usa %0 funciona bien. Usé la siguiente declaración de bloque y funciona como un encanto:

IF %0 == "%~0" pause

Espero que pueda ayudar.


No solo es posible, sino que su comportamiento deseado es el comportamiento normal de la ejecución de archivos por lotes, a menos que haga algo ''especial'':

  • al ejecutar un archivo por lotes haciendo doble clic en él en el Explorador, la ventana de cmd se cerrará cuando haya terminado;
  • cuando el archivo por lotes se ejecuta desde la línea de comandos, simplemente vuelve a la línea de comandos cuando se completa: la ventana no está cerrada;

Entonces, creo que la pregunta que debe responderse es: ¿qué está haciendo en el archivo de proceso por lotes que hace que la ventana de comandos se cierre cuando la ejecute en la línea de comandos?


Pegue esto al comienzo de su script BAT o CMD y tal vez cambie lo que sucede en la cláusula ''if'':

:: To leave command window open if script run from Windows explorer. @setlocal @set x=%cmdcmdline:"=% @set x=%x: =% @set y=%x:cmd/c=% @if "%x%" neq "%y%" cmd /k %0 %* && exit || exit @endlocal

Lo que esto hace es que si el usuario hace doble clic o llama a este script usando "cmd / c", se reiniciará con "cmd / k", lo que dejará la sesión abierta después de que finalice el comando. Esto permite al usuario SALIR o tal vez hacer otra cosa.

La razón para hacerlo de esta manera en lugar de las otras formas explicadas en esta respuesta es porque he encontrado situaciones que aún con el uso de las comillas u otros símbolos, la instrucción IF barf con ciertas situaciones de las CITAS y la / c y con espacios. Entonces, la lógica primero elimina todas las CITAS y luego elimina todos los espacios ... porque a VECES hay un espacio adicional después de eliminar las citas.

set x=%cmdcmdline:"=% <-- removes all quotes set x=%x: =% <-- removes all spaces set y=%x:cmd/c=% <-- removes cmd/c from the string saving it to y

El punto de la salida && || exit es para que si ERRORLEVEL antes de salir sea 0 (correcto), se detenga, pero también si no es 0 (algún fallo) también se detiene.

Pero puedes reemplazar esta parte:

cmd /k %0 %* && exit || exit

con algo como

set CALLED_WITH_CMD_C=YES

y luego invente sus propias diferencias en el resto de su script. Tendrías que mover o eliminar el endlocal.

El símbolo ''@'' en la parte delantera solo evita el eco, que puede tener si desea probar. No use el eco activado ni el desactivado porque cambia la configuración y afecta a todas las secuencias de comandos posteriores que llaman a la suya.


Puede agregar un parámetro de línea de comando cuando se ejecuta desde una ventana de CMD que no existirá cuando se haga doble clic en el archivo. Si no hay ningún parámetro, cierre la ventana. Si la hay, no la cierres. Puedes probar el parámetro usando %1


Una respuesta consolidada, derivada de gran parte de la información que se encuentra en esta página:

:pauseIfDoubleClicked setlocal enabledelayedexpansion set testl=%cmdcmdline:"=% set testr=!testl:%~nx0=! if not "%testl%" == "%testr%" pause

  1. La variable "testl" obtiene la línea completa de la llamada del procesador cmd (según mousio), eliminando todas las comillas dobles molestas.
  2. La variable "testr" toma "testl" y además elimina el nombre del nombre del archivo de lote actual si está presente (que será si el archivo de lote se invocó con un doble clic).
  3. La instrucción if ve si "testl" y "testr" son diferentes. Si es así, se hizo doble clic en el lote, así que haga una pausa; si no, el lote se escribió en la línea de comando, continúe.

Naturalmente, si desea hacer otra cosa si detecta un doble clic, puede cambiar la pausa.

Gracias a todos.


Use exit /b 0 , no exit

El primero saldrá completamente si se inicia desde el Explorador de Windows, pero regresará a la consola si se inicia desde la línea de comandos.


%cmdcmdline% proporciona la línea de comandos exacta utilizada para iniciar el Cmd.exe actual.

  • Cuando se inicia desde una consola de comandos, esta var es "%SystemRoot%/system32/cmd.exe" .
  • Cuando se inicia desde el explorador, esta var es cmd /c ""{full_path_to_the_bat_file}" " ;
    esto implica que también puede verificar la variable %0 en su archivo bat, ya que en este caso siempre es la ruta completa al archivo bat y siempre entre comillas dobles.

Personalmente, %cmdcmdline% enfoque %cmdcmdline% (no por %O ), pero tenga en cuenta que ambos comandos de inicio se pueden anular en el registro ...