¿Cómo suprimir la confirmación de "Finalizar trabajo por lotes (S / N)"?


154

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?


¿Alguna vez probaste la respuesta de sgmoore? superuser.com/questions/35698/…
Arjan

10
"Nunca recuerdo una instancia en la que decidí no terminar el trabajo por lotes". Y en realidad, en la mayoría de los casos, el trabajo se termina incluso si responde No ...
PhiLho

@PhiLho: eso no puede ser cierto, ya que mis scripts siempre continúan después de ingresar N. Tengo curiosidad por saber qué escenario tiene donde termina el script por lotes después de ingresar N.
dbenham

Esperaba que esto fuera fácil, pero como siempre Microsoft ha hecho que algo simple sea un fastidio. Las respuestas a continuación están gastando demasiado esfuerzo para evitar esta molestia menor. Me molesta que no haya una manera simple de resolver esto. En serio Microsoft, ¿cuál es el punto de este aviso? Sí, estoy seguro, es por eso que presioné Ctrl + C ...
Chev

Este problema al menos me hace recordar y hacer uso del -ninterruptor para cygwin ping con más frecuencia.
palswim

Respuestas:


52

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.


39
Eso es decepcionante :(
Srikanth

Sí, es decepcionante. Lo que es aún más decepcionante es que el comando BREAK, que por defecto no hace nada bajo XP, podría haber sido usado para alternar el mensaje…
Synetech

3
Aunque puede ser verdad uno no puede hacer que el intérprete se comportan de manera diferente, utilizando startcomo sgmoore sugirió al superuser.com/questions/35698/... parece una solución perfectamente bien para mí.
Arjan


58

Presione Ctrl+ Cdos veces.


55
Esto no funcionará, sino que repite el mensaje.
Joey

8
¡Acabo de matar mi base de datos al hacer eso! El script estaba esperando "pausa", así que hice CTRL-C, y luego apareció el mensaje, así que hice CTRL-C nuevamente, y luego el archivo por lotes continuó y eliminé mi base de datos. @see superuser.com/questions/740004/...
Sebastien Diot

2
Eso no es lo que pidió el OP. Podía escribir "N" con la misma facilidad después de ^ C.
vladr

3
@vladr es infinitamente más fácil de sostener Ctrly toque Cde nuevo frente a golpear Ya continuación Enter.
Nick T

21
@SebastienDiot ¿Probó una nueva técnica en un script que tenía el potencial de destruir datos permanentemente? Eso es ... valiente.
Básico

58

En este sitio , encontré una solución efectiva:

script2.cmd < nul

Para no tener que escribir esto cada vez que hice un segundo script llamado script.cmden 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:

rem Bypass "Terminate Batch Job" prompt.
if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

2
Si llama a un archivo por lotes desde sí mismo (sin usar el comando CALL), la ejecución se transfiere "permanentemente". Si STDIN se redirige a NUL, seguirá apareciendo cualquier mensaje "Terminar trabajo por lotes", pero no esperará (porque STDIN se ha ido) para la entrada. Esto funciona para mí ...
William

3
Esto funciona en Windows 7.
William

17
Funciona, a menos que necesite la entrada del usuario en el lote.
Augusto Men

2
@William, sólo llamar al script no funciona para mí, pero yo le ocurrió una solución: @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.
jpmc26

La respuesta de jpmc funcionó para mí. ¿Se hace eco de la maldita terminación (y / n)? mensaje al final, pero no se detiene.
ggb667

29

Instale Clink y cambie la configuración "terminate_autoanswer". El archivo de configuración debe estar aquí : C:\Users\<username>\AppData\Local\clink\settings.

# name: Auto-answer terminate prompt
# type: enum
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 1

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!


Clink es fantástico, pero esto no funciona para mí, usando cmd.exe o Console2. Todavía pregunta y no se llena automáticamente.
iono

@tometoftom: ¿Cambiaste el archivo de configuración como se indicó anteriormente? Tenía que hacer eso para que funcione. (Tenga en cuenta que debe ser administrador para guardar el archivo correctamente en Windows Vista y versiones posteriores ...)
Macke

3
Ah, todavía no hay dados. suspiro profundo Microsoft, por el amor de Dios ...
iono

3
@iono ¿tiene una versión de Windows que no esté en inglés? En este caso, clink no pudo responder automáticamente el mensaje hasta la versión 0.4.3 hace unos días: github.com/mridgers/clink/releases/tag/0.4.3
schlamar

3
Relacionado: para aquellos que usan cmder , la configuración está activada\cmder\config\settings . Vea el tema relacionado aquí github.com/cmderdev/cmder/issues/1666
edmundo096

17

Si no necesita hacer nada en el archivo por lotes después de que su aplicación finalice normalmente, el uso del startcomando asegura que el archivo por lotes ya esté terminado cuando presione Ctrl-C. Y por lo tanto, el mensaje no aparecerá.

Por ejemplo:

@echo off

establecer my_command = ping.exe
establecer my_params = -t www.google.com

Comando echo para ser ejecutado por 'inicio':% my_command%% my_params%

:: Cuando NO use / B o / WAIT, esto creará una nueva ventana, mientras
:: la ejecución de este mismo archivo por lotes continuará en la ventana actual:

inicio% my_command%% my_params%

eco.
echo Esta línea se ejecutará ANTES de que 'start' esté terminado. Así que esto
El archivo por lotes echo se completará ANTES de presionar Ctrl-C en la otra ventana.
eco.

:: Solo para probar use 'pausa' para mostrar "Presione cualquier tecla para continuar", para ver
:: la salida de los comandos 'echo'. Asegúrese de presionar Ctrl-C en la ventana
:: que ejecuta el comando 'ping' (no en esta misma ventana). O simplemente eliminar
:: la siguiente línea cuando se confunde:

pausa

(Probado en Windows XP).


No sé si startrealmente 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 Windows start(o especialmente start /waity start /b)? Consulte microsoft.com/resources/documentation/windows/xp/all/proddocs/… luego. Por favor explique el voto negativo?
Arjan

startno 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.
Joey

1
+1 funciona para mí. Sin embargo, / b desactiva el control Ctrl + C (lo cual es molesto).
Nick Bolton

3
Esto está bien si hace doble clic en el archivo por lotes. Pero, ¿qué pasa si inicia el archivo por lotes en la consola?
Helgi

8
(Hablando desde Windows 7, no estoy seguro si es aplicable a XP) El desarrollador irreflexivo contratado por Microsoft para codificar el startcomando 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, use start "some title here" %my_command% %my_params%. La mayoría solo usa ""y maldice al desarrollador por no usar una opción /TITLEo en su /Tlugar para establecer el título.
ADTC

13

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.exepor otra. Esto se logra ejecutando el comando / programa a través de start cmd /kseguido inmediatamente exiten el .BATarchivo.

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 tracerouteque puede ser interrumpido por Ctrl+ C, o permitir que se complete, devolviendo al usuario a la C:\>solicitud:

@echo off

set timeout=100
if not "%2"=="" set timeout=%2

start cmd /k tracert -w %timeout% %1
exit

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.


+1 Un enfoque muy novedoso y, aunque estoy de acuerdo con que no es un reemplazo exacto, funciona bien (aunque me preocupó cuando comenzó su publicación con "reemplazar cmd.exe": las alarmas de seguridad sonaban hasta que llegué al ejemplo y me di cuenta lo que quiso decir)
Básico

debe usar exit /bpara salir del script por lotes
Sebastian Godelet

1
@SebastianGodelet: Eso es un buen consejo en general, pero aquí la intención es cerrar la ventana (original) de la consola , dado que el comando de destino se inicia en una nueva ventana.
mklement0

¿Por qué usar "cmd / k" (mantener el intérprete abierto) en lugar de "/ c"? ¿Solo para poder ver la salida del comando?
Raúl Salinas-Monteagudo

9

La 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 %*), ya SHIFTque no se actualiza %*. Existen soluciones alternativas , pero tienen ciertas limitaciones.

Aquí está la modificación que terminé con:

IF [%JUSTTERMINATE%] == [OKAY] (
    SET JUSTTERMINATE=
    python myscript.py %*
) ELSE (
    SET JUSTTERMINATE=OKAY
    CALL %0 %* <NUL
)

99. (9)% sin defectos.


Esto no funcionará si myscript.pyquiere leer desde stdin.
jamesdlin


0

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ó!


0

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).


0

Simplemente redirija el lote stdin a nulo agregando <nul al final del comando.


2
Creo que puede haber querido decir <nul (ya que> nul envía todo stdout a nulo).
Brian Phillips, el

0

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.

Startes 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 -argumentsen 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.


0

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 :

Cancelar archivo por lotes en Ctrl-C : cancele el procesamiento de archivos por lotes sin el aviso habitual cuando presiona Control-C.

Captura de pantalla:

Opciones de TCC / LE

Si nunca ha oído hablar de TCC / LE antes, aquí hay algunos comentarios del sitio:

TCC / LE es un reemplazo para la línea de comando CMD (el símbolo del sistema predeterminado de Windows). TCC / LE es un superconjunto de CMD, con 111 comandos internos (CMD tiene menos de 40), 240 variables y funciones internas y cientos de mejoras a los comandos CMD existentes.

TCC / LE funciona con sus aplicaciones de línea de comandos y archivos por lotes existentes, pero ofrece mejoras importantes en las capacidades de la línea de comandos y los archivos por lotes, y agrega miles de nuevas características a sus ventanas de símbolo del sistema.

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.


0

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:

@ECHO OFF
rem assumes you have installed pslist from sysinternals to windows PATH

:RUN
echo Starting GoldenEye Dedicated Server
start "" srcds.exe -console -game gesource +maxplayers 16 +map ge_complex

:LOOP
pslist srcds >nul 2>&1
if ERRORLEVEL 1 (
  goto RUN
) else (
  rem echo Dedicated server is still running
  timeout /t 5 >nul
  goto LOOP
)


-3

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.


55
No funciono para mi.
Helgi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.