Mi problema es que en Windows, hay ventanas de línea de comandos que se cierran inmediatamente después de la ejecución. Para resolver esto, quiero que el comportamiento predeterminado sea que la ventana se mantenga abierta. Normalmente, este comportamiento se puede evitar con tres métodos que me vienen a la mente:
- Poner una
pause
línea después de los programas por lotes para solicitar al usuario que presione una tecla antes de salir - Ejecutar estos archivos por lotes u otras herramientas de manipulación de línea de comandos (incluso el servicio de inicio, reinicio, etc. con
net start xy
o algo similar) dentro decmd.exe
(Inicio - Ejecutar - cmd.exe) - Ejecutando estos programas con
cmd /k
esto:cmd /k myprogram.bat
Pero hay otros casos en los que el usuario:
- Ejecuta el programa la primera vez y no sabe que el programa en cuestión se ejecutará en el Símbolo del sistema (Procesador de comandos de Windows), por ejemplo, cuando ejecuta un acceso directo desde el menú Inicio (o desde otro lugar), O
- Le resulta un poco incómodo ejecutar cmd.exe todo el tiempo y no tiene el tiempo / la oportunidad de reescribir el código de estos comandos en todas partes para detenerlos o evitar salir explícitamente.
Leí un artículo sobre cómo cambiar el comportamiento predeterminado cmd.exe
al abrirlo explícitamente, creando una entrada de ejecución automática y manipulando su contenido en estas ubicaciones:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor\AutoRun
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Command Processor\AutoRun
(Los elementos de ejecución automática son _String values_
...)
Lo puse cmd /d /k
como valor para intentarlo, pero esto no cambió el comportamiento de las cosas mencionadas anteriormente en absoluto ... Simplemente cambió el comportamiento de la ventana de la línea de comandos al abrirla explícitamente (Start-Run- cmd.exe).
¿Entonces, cómo funciona? ¿Me puede dar alguna idea para resolver este problema?
fuente
stdout
de manera constante que nunca debieron ser visibles por una buena razón.Respuestas:
Tengo una solución que solo se puede aplicar en
.cmd
y.bat
archivos:Abra
regedit
y vaya a cada uno de:Ahora cambie el "Valor clave predeterminado" a
cmd.exe /k "%1" %*
. Ahora, cada ventana de script por lotes permanecerá abierta después de su ejecución.Tenga en cuenta que esto es como usar
cmd.exe /c cmd.exe /k program.bat
, lo que significa que se lanzará otra instancia de CMD en la instancia principal. No pude encontrar cómo sobrescribir el primer/c
argumento.También puede hacerlo con
[exefile]
, pero ahora mostrará una caja de consola vacía si el ejecutable tiene una GUI.fuente
*
. ¡Ten más cuidado al editar!Cita Microsoft :
En otras palabras, la ventana de la consola Win32 siempre se cerrará cuando salga el último programa que se ejecuta en su interior, y no puede cambiar esto.
(Para los programas de MS-DOS de 16 bits, Windows ofrece una opción "Cerrar al salir" en el cuadro de diálogo de propiedades, pero esto no es una excepción al comportamiento anterior: es el proceso NTVDM el que mantiene abierta la ventana. Además, esta opción es de nuevo por programa).
fuente
How can I do X
, noIn your opinion, should I do X
. Esta respuesta no es útil, implica que X es imposible, cuando ya se han presentado soluciones parciales en otros lugares. (-1)Simplemente abra un símbolo del sistema en la ubicación de su archivo por lotes e ingrese manualmente el nombre de su archivo por lotes para ejecutarlo dentro de esa ventana.
1.Navegue a la carpeta donde reside su ejecutable
2.Haga clic con el botón derecho y seleccione "Ventana de comandos desde aquí"
3. escriba el nombre del ejecutable y presione enter
4.El proceso debe ejecutarse, pero la ventana debe permanecer abierta
fuente
cmd.exe /k
te dará problemas con algún lote. Si el loteexit 1
(sin/B
) su consola se cerrará. Un truco es usar:Para usar esto de manera predeterminada para todos los archivos por lotes, configure
HKEY_CLASSES_ROOT\cmdfile\shell\open\command\(default)
yHKEY_CLASSES_ROOT\batfile\shell\open\command\(default)
en"%windir%\system32\cmd.exe" /k "%windir%\system32\cmd" /c "%1" %*
.fuente
"%*"
pasa la lista completa de parámetros, entonces ¿no pasaría esto el primer parámetro dos veces, una"%1"
y otra vez como el primer parámetro de"%*"
?%1 %2 %3 ..
y%*
que no recuerdo en este momento, pero%1 %2 %3
funciona en algunos casos donde%*
falla.Acabo de encontrar una solución tonta después de leer
grawity
la respuesta.Mi caso de uso fue configurar 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 de doskey y ser arrojado al shell.
Mi solución (acaba de probar en Win7) como agregar
cmd
como la última línea en el archivo por lotes. Esto ejecuta un símbolo del sistema anidado que hereda el entorno de su padre. Ese shell secundario mantiene abierto el proceso por lotes hasta que SALIR, momento en el cual el lote no tiene procesos secundarios y también sale.fuente
En lugar de usar PAUSE (prefiero CHOICE o TIMEOUT que usar PAUSE cuando sea necesario), puede usar la solución aquí: 886848 / how-to-make-windows-batch-file-pause-when-doble-click .
De esta manera, si hace clic en un archivo por lotes o enlace (acceso directo) desde el Explorador de Windows, puede hacer que el programa de archivos por lotes se pause antes de salir para poder ver la salida del programa y cualquier mensaje de error.
Con CHOICE, puede programar la capacidad para que el usuario seleccione una variedad de acciones, y el uso de TIMEOUT puede permitir que la ventana se cierre después de un retraso de tiempo (desatendido). Si ejecuta el archivo por lotes desde una ventana de símbolo del sistema, 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 del símbolo del sistema.
Puede leer más en el enlace proporcionado, pero lo básico es que usa la variable de entorno:
para determinar si el archivo por lotes se ejecutó desde una ventana de comandos o no.
Entonces, lo usas así:
En el punto donde saldrá el archivo por lotes, agregue un código como este:
fuente
La mejor manera que he encontrado para evitar esto es llamar a sus archivos por lotes desde otro archivo por lotes usando inicio.
así que si normalmente ejecuta un archivo llamado go.bat, entonces crearía un segundo archivo por lotes llamado algo así como go2.bat
el contenido de go2.bat solo sería
la primera ventana se cierra inmediatamente, pero la que ejecuta go.bat permanece abierta
fuente
Esto funciona para la versión 5.00 del Editor del Registro de Windows.
¡Guarde los cmds anteriores en un archivo llamado algo así
cmdbatfile-open.reg
y ejecútelo!fuente
Supongamos que tiene dos archivos por lotes que desea iniciar en su propia instancia y mantenerlos abiertos si su ejecutable sale. Llamemos a esos dos lotes
A.bat
yB.bat
.Ahora, para simplificar, podría tener un archivo por lotes para iniciar ambos, llamemos a eso
launch_both.bat
con contenido:Es posible que no funcione como se espera si llama
exit
a uno de los dos archivos por lotes. Eso tendrá que ser probado.fuente
Para los usuarios que usan Windows 10, tenga en cuenta que ninguna de las respuestas anteriores funciona actualmente para Windows 10.
Para Windows 10, si tiene acceso al script, debe agregar el siguiente código al final:
Ese código esperará una entrada antes de cerrar.
fuente
En respuesta a PSIXO degradado - "Esta respuesta ya estaba cubierta en la pregunta. - Ro Yo Mi Ene 20 '16 a las 5:06" - NO, NO. Las respuestas anteriores fueron: "pausa", que NO funcionó. La respuesta de PSIXO fue: "& pausa", que funciona. Analice con más cuidado antes de degradar. Ejecuté esto desde un indicador IDLE, y funcionó:
Por otra parte:
NO funcionó (el indicador de cmd parpadeó y, de hecho, devolvió un error (1)). Gracias a PSIXO por la respuesta que necesitaba. Enrique.
fuente