En cmd, cuando presionamos Ctrl + C, la aplicación de destino finaliza, pero si la aplicación de destino se llama desde un archivo por lotes, obtenemos esta confirmación de "Finalizar trabajo por lotes (S / N)". Nunca puedo recordar una instancia en la que elegí no terminar el trabajo por lotes. ¿Cómo podemos omitir esta confirmación?
windows
command-line
batch
Srikanth
fuente
fuente
N
. Tengo curiosidad por saber qué escenario tiene donde termina el script por lotes después de ingresarN
.-n
interruptor para cygwin ping con más frecuencia.Respuestas:
AFAIK no puede ya que este comportamiento es por diseño y controlado por el intérprete de comandos. No hay ningún método para "mapear" o incluso "interceptar" esto a menos que descompile y vuelva a compilar el intérprete directamente.
fuente
start
como sgmoore sugirió al superuser.com/questions/35698/... parece una solución perfectamente bien para mí.Presione Ctrl+ Cdos veces.
fuente
Ctrl
y toqueC
de nuevo frente a golpearY
a continuaciónEnter
.En este sitio , encontré una solución efectiva:
Para no tener que escribir esto cada vez que hice un segundo script llamado
script.cmd
en la misma carpeta con la línea de arriba. He probado esta técnica solo en XP, pero otros lo han confirmado en Win 7.Nathan agrega: otra opción es poner el siguiente código en la parte superior de script.cmd que hace lo mismo en un archivo:
fuente
@IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command])
. Se llama recursivamente, pero con un argumento la segunda vez. Si su script tiene argumentos, podría utilizar el primer argumento posicional no utilizado. Eso podría ser problemático si su script tiene muchos argumentos. Mi script no necesitaba argumentos ni aportes del usuario.Instale Clink y cambie la configuración "terminate_autoanswer". El archivo de configuración debe estar aquí :
C:\Users\<username>\AppData\Local\clink\settings
.Esto entonces "simplemente funciona" con cualquier ventana cmd.exe. No necesita modificar lo que se está ejecutando o no, ya que haga clic en piggy-backs en cmd.exe.
¡Impresionante, IMO!
fuente
\cmder\config\settings
. Vea el tema relacionado aquí github.com/cmderdev/cmder/issues/1666Si no necesita hacer nada en el archivo por lotes después de que su aplicación finalice normalmente, el uso del
start
comando asegura que el archivo por lotes ya esté terminado cuando presione Ctrl-C. Y por lo tanto, el mensaje no aparecerá.Por ejemplo:
(Probado en Windows XP).
fuente
start
realmente ayudaría, pero me parece plausible. Entonces, me pregunto si el voto negativo implica que esto NO funcionaría. ¿O tal vez quien rechazó el voto no conoce el comando de Windowsstart
(o especialmentestart /wait
ystart /b
)? Consulte microsoft.com/resources/documentation/windows/xp/all/proddocs/… luego. Por favor explique el voto negativo?start
no funciona Siempre que cmd esté ejecutando un archivo por lotes, tocar Ctrl + C hará que el proceso actualmente en ejecución finalice y muestre la pregunta.start
comando tomó la tonta decisión de hacer que el título de la ventana fuera obligatorio y opcional al mismo tiempo, de una manera bastante confusa. Entonces, si alguna vez tu%my_command%
está entre comillas dobles, se convierte en el título de la ventana y el primer parámetro se%my_params%
convierte en el comando . Para estar seguro, usestart "some title here" %my_command% %my_params%
. La mayoría solo usa""
y maldice al desarrollador por no usar una opción/TITLE
o en su/T
lugar para establecer el título.He estado luchando con este deseo de evitar el mensaje "Terminar trabajo por lotes" por un tiempo.
Mi última epifanía es un poco un juego de manos (o ventana de consola), al reemplazar una instancia de
cmd.exe
por otra. Esto se logra ejecutando el comando / programa a través destart cmd /k
seguido inmediatamenteexit
en el.BAT
archivo.La ventana de consola original desaparece y la de reemplazo se puede detener limpiamente a través de Ctrl- C.
Considere el siguiente ejemplo de un
traceroute
que puede ser interrumpido por Ctrl+ C, o permitir que se complete, devolviendo al usuario a laC:\>
solicitud:La sustitución del entorno de un nuevo intérprete de comandos puede no ser para todos, pero, a simple vista, me parece y funciona bien.
fuente
exit /b
para salir del script por lotesLa solución de Gringo es buena, pero no funciona bien con los scripts que pasan a lo largo de la lista de argumentos (es decir
python myscript.py %*
), yaSHIFT
que no se actualiza%*
. Existen soluciones alternativas , pero tienen ciertas limitaciones.Aquí está la modificación que terminé con:
99. (9)% sin defectos.
fuente
myscript.py
quiere leer desde stdin.Ver esta pregunta de desbordamiento de pila .
Sin embargo, parchear cmd.exe no es algo que haría para eso.
fuente
En mi caso, era el archivo ping.bat que estaba justo en mi directorio de usuarios (C: \ Users \ en Vista o C: \ Documents and Settings \ en XP) que estaba reteniendo el trabajo por lotes de forma indeterminada.
Este archivo por lotes se ejecutó cada vez que ejecuté ping desde el símbolo del sistema donde el directorio actual es mi directorio de usuario. Hacer ping desde la ventana Ejecutar o desde el directorio de otro usuario funcionaba bien.
¡Eliminé el archivo de mi directorio de usuario y el problema se resolvió!
fuente
Inicio funciona, pero ahora la ventana abierta por el archivo por lotes cambia de las opciones que tenía y las "propiedades" están deshabilitadas (no responderán).
fuente
Simplemente redirija el lote stdin a nulo agregando <nul al final del comando.
fuente
Me encontré con esto con un EXE que parecía arrojar ^ C al lote principal al salir, provocando el mensaje "Terminar trabajo por lotes" incluso en una salida limpia.
La solución que elegí usar fue ejecutar el lote con "Inicio", similar a otras respuestas, pero desde un indicador de PowerShell (o mediante el método de intérprete de PowerShell de CMD, si lo desea).
Ahora es 2018, y en Windows 10 Microsoft ha comenzado a suplantar CMD con PowerShell como el símbolo del sistema preferido, por lo que está disponible de forma predeterminada en la GUI.
Start
es un alias para Start-Process .Cuando se ejecuta, solo se inicia y regresa. Por lo tanto, cuando detiene el proceso iniciado, no aparece el mensaje "Finalizar trabajo por lotes".
Por defecto, no espera, por lo que no se requieren argumentos adicionales más allá del comando y sus argumentos.
El uso
start mything.exe -mythings -arguments
en mi lote funcionó perfectamente.En PowerShell, los scripts deben estar precedidos por su ruta de acceso para que se ejecuten, por lo que ejecuto mi archivo por lotes como
.\host.bat
.fuente
TCC / LE , que es un reemplazo gratuito de CMD (piense en ello como CMD ++), tiene una opción para suprimir la solicitud de finalización del trabajo por lotes. Puede encontrar la opción en el cuadro de diálogo Configuración de inicio de TCC :
Captura de pantalla:
Si nunca ha oído hablar de TCC / LE antes, aquí hay algunos comentarios del sitio:
Utilicé TCC / LE durante años y 4NT antes. Me encanta y puedo recomendarlo. La única razón por la que aún no lo uso es porque ahora uso casi exclusivamente PowerShell.
fuente
Una razón principal para suprimir el "Terminar trabajo por lotes (S / N)" es ejecutar un programa en un bucle (por ejemplo: volver a ejecutarlo en caso de que falle).
Este https://stackoverflow.com/a/8185270/1170023 ayudó a llevar a esta solución:
fuente
La forma más fácil de suprimir la confirmación si usa el terminal Hyper es agregar el complemento hyper-yes .
fuente
Al final de su secuencia de comandos, simplemente agregue el siguiente comando:
echo
Esto no "dañará" el comportamiento de su secuencia de comandos y parece evitar que CDM le pregunte si desea finalizar el lote.
fuente