![¿Cómo suprimir la confirmación de finalización del trabajo por lotes de Windows?](https://rvso.com/image/1665763/%C2%BFC%C3%B3mo%20suprimir%20la%20confirmaci%C3%B3n%20de%20finalizaci%C3%B3n%20del%20trabajo%20por%20lotes%20de%20Windows%3F.png)
Cuando un trabajo por lotes de Windows ha iniciado un programa (ejecutable), el usuario puede presionar Ctrl-C para detener el programa.
Esto hace que el trabajo por lotes de Windows muestre el mensaje "Terminar trabajo por lotes (S/N)" y espere a que se presionen las teclas.
¿Cómo puedo suprimir este mensaje y la necesidad de presionar cualquier tecla?
Respuesta1
Ampliando la sugerencia de @KTaTk, siempre que golpee el código de retorno en el condicional, se suprimirá el mensaje "Terminar trabajo por lotes (S/N)".
Mi solución es:
setlocal enabledelayedexpansion
program.exe & set SAVEDRC=!ERRORLEVEL! & call;
echo Return Code was %SAVEDRC%
exit /b %SAVEDRC%
Tenga en cuenta que es necesario utilizar !ERRORLEVEL!
(expansión retrasada) para obtener el valor en la misma declaración compuesta, ya que %ERRORLEVEL%
(expansión en tiempo de análisis) no refleja el código de retorno actualizado del programa.
Luego, la call;
función restablece el nivel de error a 0 antes de que se ejecute la siguiente línea.
Finalmente (opcionalmente), salimos con el código de retorno guardado. Si es -1073741510 ( STATUS_CONTROL_C_EXIT
) y el proceso principal también es cmd shell, entonces el proceso principal mostrará ese mensaje.
Alternativamente, parece que el mensaje Ctrl-c solo ocurre si es el código de retorno de otro proceso el que causa ese código de salida. Entonces creando unfunciónque simplemente sale sin cambiar el ERRORLEVEL también suprimirá el mensaje:
program.exe & call:ignoreCtrlC
echo Return Code was %ERRORLEVEL%
goto:eof
:ignoreCtrlC
exit /b
Respuesta2
Puedes usarejecución condicionalen el comando que lanza el ejecutable:
my_executable.exe && exit 0 || exit 1
Esto suprime cualquier solicitud y sale del trabajo por lotes con el código 0 o 1, según el código de salida del ejecutable.
Esto funciona tanto para Ctrl-C como para Ctrl-Break.
Respuesta3
Dado que CTRL-BREAK o CTRL-C ya es una pulsación de tecla, es posible que esté buscando una respuesta que detenga un script por lotes sin necesidad de presionar CTRL-C o CTRL-BREAK.
Esta respuesta es en caso de que ese sea tu objetivo.
En Batch, puede usar etiquetas y declaraciones IF para saltar en su secuencia de comandos.
Por ejemplo:
@echo off
:: -- Lets print something to the screen.
echo This is a test before the loop starts
:: -- Lets set a counter variable to 0, just to be sure.
set counter=0
:: -- Set loop beginning point
:begin
:: -- Increase the counter by one but don't display the result to the screen
set /a counter=counter+1 >nul
:: -- now, write it to the screen our way.
echo Progress: %counter% of 10
:: -- pause the script for a second but without any displaying...
ping localhost -n 2 >nul
:: -- see if we reached 10, if so jump to the exit point of the script.
if %counter%==10 goto exit
:: -- if we reached this point, we have not jumped to the exit point.
:: -- so instead, lets jump back to the beginning point.
:: -- identation is used so the loop clearly stands out in the script
goto begin
:: -- set exit point for this script
:exit
:: -- lets print a message. We don't have to, but its nice, right?
echo End of the script has been reached.
Esto produce el siguiente resultado, suponiendo que escribimos c:\temp\counter.cmd:
c:\temp>counter
This is a test before the loop starts
Progress: 1 of 10
Progress: 2 of 10
Progress: 3 of 10
Progress: 4 of 10
Progress: 5 of 10
Progress: 6 of 10
Progress: 7 of 10
Progress: 8 of 10
Progress: 9 of 10
Progress: 10 of 10
End of the script has been reached.