Cómo evitar el cierre automático de la consola después de la ejecución del archivo por lotes

510

¿Qué comando puedo poner al final de un archivo por lotes para evitar el cierre automático de la consola después de la ejecución del archivo?

joe
fuente
55
Sería bueno si hay una manera de detectar si un archivo .cmd se inició haciendo doble clic en el explorador (entonces desea que se detenga al final) o si se inició mediante una línea de comando ya abierta. En el último caso (y especialmente si es ejecutado por otro programa) no desea la pausa. No he encontrado una buena solución para este caso (y normalmente uso una variable if% NOPAUSE%, pero esto solo funciona para programas principales, no para shells paremt).
Eckes

Respuestas:

635

En archivos por lotes de Windows / DOS:

pause

Esto imprime un buen "Press any key to continue . . . "mensaje

O, si no quieres el "Press any key to continue . . ."mensaje, haz esto en su lugar:

pause >nul
Dave Bauman
fuente
14
Ninguna de las sugerencias aquí funciona para mí al hacer doble clic en el archivo bat. Es un entorno de servidor (y tengo que ejecutar el script en él), por lo que podrían haber modificado el comportamiento. Eso no cambia mi objetivo. Para mantener abierta la ventana de comandos para poder escribir el mensaje de error.
Henrik Erlandsson
1
Sí, esto no siempre funciona dependiendo del entorno. Para una solución más robusta, vea mi respuesta a continuación. Esencialmente, simplemente haga set / p exitkey = "Presione cualquier tecla para continuar ..."
Steven Mark Ford
Tenga cuidado, si alguien ejecuta su secuencia de comandos sin la ventana de la consola (por ejemplo, a través del script vbscript), se bloqueará hasta que la elimine a través del Administrador de tareas.
Andry
Si es algo así como Maven, use CALL, stackoverflow.com/a/52205298/4485678
Kevin Roy
pausa funciona perfectamente aquí
Davidson Lima
141

Depende de la pregunta exacta!

Normalmente pausehace el trabajo dentro de un archivo .bat .

Si desea que cmd.exe no se cierre para poder seguir escribiendo, use el cmd /kcomando al final del archivo.

Rutger Nijlunsing
fuente
2
Si está ejecutando comandos de Windows a través del cuadro de diálogo Ejecutar, coloque cmd /kantes su comando. & cmd /kno funciona
Noumenon
68

Si desea que cmd.exe no se cierre y pueda continuar escribiendo, use cmd /k

Simplemente sentí la necesidad de aclarar qué /khace (desde el sitio web de Windows):

/k : Ejecuta el comando especificado por string y continúa.

Entonces, cmd /ksin un comando de seguimiento al final del archivo bat, solo mantendrá la cmd.exeventana abierta para su uso posterior.

Por otro lado, pauseal final de un archivo por lotes, simplemente pausará el proceso y terminará cmd.exeal presionar el primer botón

Piedra de san valentín
fuente
24

La siguiente forma de tener comandos en un archivo por lotes abrirá nuevas ventanas de símbolo del sistema y las nuevas ventanas no se cerrarán automáticamente.

start "title" call abcd.exe param1 param2  
start "title" call xyz.exe param1 param2
usuario6928445
fuente
2
En mi caso, tuve un error durante la ejecución del comando de terminal, por lo que los comandos 'pausa' y 'cmd / k' no me ayudaron a detener la causa del error del programa. Este ejemplo me ayudó a mostrar, tengo un error y también me detuve bastante desde la terminal. ¡Gracias!
HowDoYouTellForAChild
20

Si está utilizando Maven y desea omitir el tipeo y evitar que la consola se cierre para ver el resultado, debe usar el CALLcomando en el script, además de 'mvn clean install'.

De esta manera cerrará la consola

ECHO This is the wrong exemple
mvn clean install
pause

Así la consola permanecerá abierta

ECHO This is the right exemple
CALL mvn clean install
pause

Si no usa el CALLcomando, ninguno de los ejemplos pasados ​​funcionará.

Andrey Hartung
fuente
1
¡Muchas gracias! Impide que se cierre el aviso si falla el comando.
Timur Gilauri
1
Funcionó para mi. Quería ejecutar 2 comandos diferentes en 1 archivo bat. pero mi aviso se cerró después del primer comando. Poniendo call <myCommand>resuelto este problema: mi aviso dejó de cerrarse después de la primera ejecución
Zombkey
1
Respuesta más útil
gianmarcocalbi
14

Agregue cmd.execomo una nueva línea debajo del código que desea ejecutar:

c:\Python27\python D:\code\simple_http_server.py

cmd.exe
Lyfing
fuente
Esto es exactamente lo que estaba buscando, ¡gracias! La "pausa" simplemente no funcionará cuando su script de Python se bloquee. Lo que quería es ver un mensaje de error. Hasta ahora tenía que ejecutar mis scripts de Python a través de la consola
user70960
Pero esto funciona bien:python script.py %1 && cmd
user70960
¡Gracias! Esto ayudó! Estaba creando un archivo por lotes para ejecutar aplicaciones de Python.
fez.tival
10

mi manera es escribir un lote real (diciendo "foo.bat") para terminar el trabajo; luego cree otro "start.bat":

@echo off
cmd /k foo.bat

Creo que esto es extremadamente útil cuando configuro variables de entorno únicas.

Erich Chen
fuente
1
Simplemente puede poner cmd /k(sin ningún comando) al final del foo.batarchivo y ejecutarlo. No necesitas un start.batarchivo separado .
ADTC
9

Llame cmdal final del archivo por lotes.

usuario4155296
fuente
5

además pause.

set /p=

se puede usar. Esperará la entrada del usuario y liberará el flujo cuando se presione enter.

o

runas /user:# "" >nul 2>&1

que hará lo mismo excepto que no se mostrará nada de la entrada del usuario ni permanecerá en el historial de comandos.

npocmaka
fuente
3

Posibilidad 1: solo crea 2 archivos .bat y escribe en el primero:

start <filename> // name of 2nd batch file
exit

El archivo por lotes 2 es el archivo que no se cerrará al final. Entonces, cuando abra el lote nr.1, comenzará el segundo y se cerrará. Cuando finalice el segundo, no se cerrará por completo (siempre que no ponga la salida al final)

Posibilidad 2: archivo por lotes 1:

call <filename>
cls
echo End of file
pause
<any code you want>

Cuando finalice el segundo archivo, continuará con el archivo 1 nuevamente y generará el resto. Con eso incluso puedes hacer manejadores de errores. Si nr.1 falla, entra en nr.2 y lo muestra

BlazeLP
fuente
2

Este pequeño truco le pide al usuario que ingrese una clave y la almacena en la variable% exitkey% (aunque esta variable podría llamarse como quiera).

set /p exitkey= "Press any key to continue..."

NB: el espacio después de '=' es muy importante

Steven Mark Ford
fuente
2
pause

o

echo text to display
pause>nul
Zenedus
fuente
2

Sé que llego tarde pero mi forma preferida es:

:programend
pause>nul
GOTO programend

De esta forma, el usuario no puede salir con enter.

decadencia
fuente
Creo que sí, ya que es una forma mejorada de evitar que la consola se cierre. Incluso si el usuario presiona una tecla, la consola permanece abierta. El usuario se verá obligado a salir solo al cerrar la ventana de la consola.
decadenza
2

Tuve problemas con las respuestas aquí, así que se me ocurrió esto, que funciona para mí (TM):

cmd /c node_modules\.bin\tsc
cmd /c node rollup_build.js
pause
lama12345
fuente
1

Hay dos formas de hacerlo dependiendo del caso de uso

1) Si desea que el indicador de cmd de Windows permanezca abierto para que pueda ver el resultado de la ejecución y cerrarlo después; utilizar

pause

2) si desea que el indicador de cmd de Windows permanezca abierto y le permita ejecutar algunos comandos posteriores; utilizar

cmd

ingrese la descripción de la imagen aquí

Hitesh Sahu
fuente
1

Fácil, agrega cmd a tu última línea de murciélago, ¡PERO! Si restablece o borra la ruta del sistema, debe iniciar su cmd con la ruta completa, como:

%windir%\system32\cmd.exe

Por ejemplo, tengo un archivo bat para restablecer jdk a la versión anterior como esta:

PATH=C:\Program Files\Java\jdk1.6.0_45\bin;C:\apache-ant-1.7.1\bin
SET JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45
%windir%\system32\cmd.exe

desde que restablecí la ruta del sistema, tengo que ejecutar cmd con la ruta completa, o el sistema no puede encontrar cmd.exe, no podrá ejecutar cmd y simplemente cerrará la ventana y no podrá ver el mensaje de error .

Wei Kleeff
fuente