2011-07-04 15:32:05 +0000 2011-07-04 15:32:05 +0000
56
56

¿Cómo evitar que la línea de comandos se cierre después de la ejecución?

Mi problema es que en Windows, hay ventanas de línea de comandos que se cierran inmediatamente después de la ejecución. Para solucionarlo, quiero que el comportamiento por defecto sea que la ventana se mantenga abierta. Normalmente, este comportamiento puede evitarse con tres métodos que se me ocurren:

  1. Poner una línea pause después de los programas por lotes para pedir al usuario que presione una tecla antes de salir
  2. Ejecutar estos archivos por lotes u otras herramientas de manipulación de la línea de comandos (incluso el inicio del servicio, el reinicio, etc. con net start xy o cualquier otra cosa similar) dentro de cmd.exe(Start - Run - cmd.exe)
  3. Ejecutando estos programas con cmd /k así: cmd /k myprogram.bat

Pero hay algunos otros casos en los que el usuario:

  1. Ejecuta el programa la primera vez y no sabe que el programa dado se ejecutará en el Símbolo del sistema (Procesador de comandos de Windows), por ejemplo, al ejecutar un acceso directo desde el menú Inicio (o desde otro lugar), O
  2. Le resulta un poco incómodo ejecutar cmd.exe todo el tiempo y no tiene tiempo/oportunidad de reescribir el código de estos comandos en todas partes para poner una pausa después de ellos o evitar salir explícitamente.

He leído un artículo sobre el cambio del comportamiento por defecto de cmd.exe al abrirlo explícitamente, con la creación de una entrada AutoRun y manipulando su contenido en estos lugares:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun

(Los elementos de AutoRun son _String values_…)

puse cmd /d /k como valor de él para darle una oportunidad, pero esto no cambió el comportamiento de las cosas mencionadas arriba en absoluto… Sólo cambió el comportamiento de la ventana de la línea de comandos al abrirla explícitamente (Start-Run-cmd.exe).

Entonces, ¿cómo funciona? ¿Puedes darme alguna idea para resolver este problema?

Réponses (11)

18
18
18
2011-07-04 17:45:20 +0000

Cita Microsoft :

Una consola se cierra cuando el último proceso conectado a ella termina o llama a la FreeConsole.

En otras palabras, la ventana de la consola de Win32 siempre se cerrará cuando el último programa que se ejecuta dentro de ella salga, y no se puede cambiar esto.


(Para los programas de 16 bits de MS-DOS, Windows ofrece una opción “Cerrar al salir” en el diálogo de propiedades, pero esto no es una excepción al comportamiento anterior: es el proceso NTVDM el que mantiene la ventana abierta. Además, esta opción es de nuevo por programa).

8
8
8
2013-03-21 14:10:13 +0000

Sólo tiene que abrir un símbolo del sistema en la ubicación de su archivo por lotes y teclear manualmente el nombre de su archivo por lotes para ejecutarlo dentro de esa ventana.

1.Navegue hasta la carpeta donde reside su ejecutable 2.Mayúsculas-Derecha haga clic y seleccione “Ventana de Comandos desde aquí” 3.Escriba el nombre del ejecutable y pulse intro 4.El proceso debería ejecutarse, pero la ventana debería permanecer abierta

4
4
4
2012-11-06 13:37:01 +0000

cmd.exe /k te dará problemas con algún lote. Si el lote exit 1 (sin /B) tu consola se cerrará. Un truco es usar:

cmd.exe /k cmd /c ...

Para usar esto por defecto para todos los archivos del lote, establece HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default) y HKEY_CLASSES_ROOT\batfile\shell\open\command\(default) en "%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*.

3
3
3
2014-04-26 16:55:23 +0000

Acabo de encontrar una solución tonta después de leer la respuesta de grawity.

Mi caso de uso fue la creación de un entorno de consola en el trabajo donde se bloquean todas las soluciones más razonables. Todo lo que necesito es establecer PATH y configurar algunos alias doskey y ser volcado al shell.

Mi solución (recién probada en Win7) como agregar cmd como la última línea en el archivo batch. Esto ejecuta una línea de comandos anidada que hereda el entorno de su padre. Ese shell hijo mantiene el proceso por lotes abierto hasta que EXITES, en cuyo momento el lote no tiene procesos hijos y también sale.

2
2
2
2015-12-11 17:02:56 +0000

Supongamos que tienes dos archivos por lotes que quieres lanzar en su propia instancia y mantener abiertos si su ejecutable sale. Llamemos a esos dos lotes A.bat y B.bat.

Ahora, para simplificar, podrías tener un archivo por lotes para lanzarlos a ambos, llamémoslo launch_both.bat con el contenido:

start cmd /k "A.bat & cmd /c"
start cmd /k "B.bat & cmd /c"

Podría no funcionar como se espera si llamas a exit en uno de los dos archivos por lotes. Eso tendrá que ser probado.

2
2
2
2013-03-21 20:02:36 +0000

En lugar de usar PAUSE (prefiero CHOICE o TIMEOUT a usar PAUSE cuando sea necesario), puedes usar la solución aquí: 886848/how-to make-windows-batch-file-pause-when-double-click .

De esta manera, si haces click en un archivo o enlace (atajo) por lotes desde el Explorador de Windows, puedes hacer que el programa de archivos por lotes se pause antes de salir para que puedas ver la salida del programa y cualquier mensaje de error.

Usando CHOICE, puede programar la habilidad para que el usuario seleccione una variedad de acciones a tomar, y usando TIMEOUT puede dejar que la ventana se cierre después de una demora de tiempo (desatendida). Si ejecuta el archivo por lotes desde una ventana de la línea de comandos, estas pausas pueden ser molestas.

La solución vinculada le permitirá decidir si desea omitir las pausas si el archivo por lotes se ejecutó desde una ventana de la línea de comandos.

Puedes leer más en el enlace proporcionado, pero lo básico es que utiliza la variable de entorno:

%cmdcmdline%

para determinar si el archivo por lotes se ejecutó desde una ventana de comandos o no.

Así que, lo usas así:

En el punto donde el archivo por lotes saldrá, añades algún código como este:

echo %cmdcmdline:"=-% | find /i "cmd /c --%~dpf0%-"
if %errorlevel% NEQ 0 goto :EOF
pause
goto :EOF

rem if %errorlevel% EQU 0 batch-file: %~dpf0 was executed from Windows Explorer, ...
rem if %errorlevel% NEQ 0 batch-file: %~dpf0 was executed from within a Command Prompt
1
1
1
2013-03-12 15:30:15 +0000

La mejor manera que he encontrado para evitar esto es llamar a tus archivos por lotes desde otro archivo por lotes usando start.

así que si normalmente ejecutas un archivo llamado go.bat, entonces crearías un segundo archivo por lotes llamado algo como go2.bat

el contenido de go2.bat sólo sería

start go.bat

la primera ventana se cierra inmediatamente, pero la que ejecuta tu go.bat permanece abierta

1
1
1
2013-09-24 12:30:12 +0000

Esto funciona para la versión 5.00 del Editor del Registro de Windows.

[HKEY_CLASSES_ROOT\batfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

[HKEY_CLASSES_ROOT\cmdfile\shell\open\command]
@="cmd.exe /k \"%1\" %*"

¡Guarda los cmds anteriores en un archivo llamado algo como cmdbatfile-open.reg y ejecútalo!

0
0
0
2017-03-30 08:30:11 +0000

Para los usuarios que utilizan Windows 10, tenga en cuenta que ninguna de las respuestas anteriores funciona actualmente para Windows 10.

En el caso de Windows 10, si tiene acceso al script, debe agregar el siguiente código al final:

read

Ese código esperará una entrada antes de cerrarse.

0
0
0
2019-12-31 21:58:53 +0000

La pregunta de la OP es mucho más complicada que lo que yo necesitaba, y por lo tanto esta respuesta es para otros que vienen aquí buscando una forma sencilla de lanzar un programa de línea de comandos y mantener la ventana abierta después de que el programa de línea de comandos salga.

En mi caso, quería ejecutar NodeJS y mantener la ventana de la consola abierta después de que NodeJS se detuviera. Aquí estaba mi solución:

Archivo: RunNodeJS.bat

@echo off
cd /d c:\
cmd.exe /k cmd /c node

Luego creé un atajo a ese archivo en mi escritorio y hice doble clic en el atajo para lanzar una consola cmd.exe que ejecuta el comando de nodo y permanece abierta después de que éste (el comando de nodo) sale.

Utilicé cmd.exe /k cmd /c node debido a otra respuesta dada aquí.

0
0
0
2017-06-30 03:30:27 +0000

En respuesta al PSIXO degradado - “Esta respuesta ya estaba cubierta en la pregunta. - Ro Yo Mi Jan 20 ‘16 a las 5:06” - NO, no lo fue. Las respuestas anteriores fueron: “pausa”, que NO funcionó. La respuesta de PSIXO fue: “y pausa”, que SÍ funcionó. Por favor, analice con más cuidado antes de bajar de categoría. Lo corrí desde un prompt de IDLE, y funcionó:

>>> os.system('dir ^ & pause')
    0
    >>>

Por otro lado:

>>> os.system('dir ^ pause')
    1
    >>>

NO funcionó (el prompt de cmd se desvió, y de hecho devolvió un error (1)). Gracias a PSIXO por la respuesta que necesitaba. Henry.