Como suprimir a confirmação de “Terminate batch job (Y / N)”?

133

No cmd, quando pressionamos Ctrl + C, terminamos o aplicativo de destino, mas se o aplicativo de destino for chamado de um arquivo de lote, obtemos a confirmação "Encerrar o trabalho de lote (S / N)". Nunca me lembro de uma instância em que optei por não finalizar o trabalho em lote. Como podemos pular esta confirmação?

    
por Srikanth 04.09.2009 / 14:39

16 respostas

44

AFAIK você não pode, pois esse comportamento é por design e controlado pelo interpretador de comandos. Não há nenhum método de "mapeamento" ou mesmo "interceptar" isso, a menos que você descompile e recompile o interpretador diretamente.

    
por 04.09.2009 / 14:42
54

Pressione Ctrl + C duas vezes.

    
por 04.09.2009 / 20:28
42

Neste site , Eu encontrei uma solução eficaz:

script2.cmd < nul

Para não ter que digitar isso toda vez que eu fiz um segundo script chamado script.cmd na mesma pasta com a linha acima. Eu testei essa técnica apenas no XP, mas outras confirmaram no Win 7.

Nathan acrescenta: outra opção é colocar o seguinte código no topo do script.cmd, que faz a mesma coisa em um arquivo:

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
)
    
por 03.11.2012 / 04:29
22

Instale Clink e altere a configuração "terminate_autoanswer". O arquivo de configurações deve estar aqui : 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

Isso, então, "simplesmente funciona" com qualquer janela do cmd.exe. Você não precisa alterar o que está sendo executado ou não, desde que clink piggy-backs no cmd.exe.

Engraçado, IMO!

    
por 03.04.2013 / 08:50
16

Se você não precisar fazer nada no arquivo de lote após o término do aplicativo normalmente, use o start garante que o arquivo em lote já esteja concluído no momento em que você pressionar Ctrl-C. E daí a mensagem não aparecerá.

Por exemplo:

@echo off

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

echo Command to be executed by 'start': %my_command% %my_params%

:: When NOT using /B or /WAIT then this will create a new window, while
:: execution of this very batch file will continue in the current window:

start %my_command% %my_params%

echo.
echo This line will be executed BEFORE 'start' is even finished. So, this
echo batch file will complete BEFORE one presses Ctrl-C in the other window.
echo.

:: Just for testing use 'pause' to show "Press any key to continue", to see
:: the output of the 'echo' commands. Be sure to press Ctrl-C in the window
:: that runs the 'ping' command (not in this very window). Or simply remove
:: the next line when confused:

pause

(testado no Windows XP).

    
por 04.09.2009 / 15:33
13

Eu tenho lutado com esse desejo de evitar o prompt "Encerrar o trabalho em lote" por um tempo.

Meu último epifania é um pouco de truque (ou janela do console), substituindo uma instância de cmd.exe por outra. Isso é feito executando o comando / programa via start cmd /k seguido imediatamente por exit no arquivo .BAT .

A janela do console original desaparece e a de substituição pode ser parada por meio de Ctrl - C .

Considere o seguinte exemplo de um traceroute que pode ser interrompido por Ctrl + C , ou com permissão para concluir, retornando o usuário ao prompt C:\> :

@echo off

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

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

A substituição do ambiente de um novo intérprete de comando pode não ser para todos, mas, a olho nu, parece e funciona bem para mim.

    
por 16.05.2011 / 19:05
7

A solução do Gringo é boa, mas não funciona bem com scripts que passam na lista de argumentos (por exemplo, python myscript.py %* ), pois SHIFT não atualiza %* . Existem soluções alternativas , mas elas têm certas limitações.

Esta é a modificação que acabei com:

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

99. (9)% sem falhas.

    
por 12.02.2014 / 12:33
4

Veja esta pergunta sobre estouro de pilha .

No entanto, o patch do cmd.exe não é algo que eu faria por isso.

    
por 04.09.2009 / 20:21
0

No meu caso, era o arquivo ping.bat que estava no meu diretório de usuários (C: \ Users \ no Vista ou C: \ Documents and Settings \ no XP) que estava mantendo o trabalho em lote indeterminadamente.

Esse arquivo em lote foi executado sempre que eu executei o ping no prompt de comando, no qual o diretório atual é meu diretório de usuários. O ping da janela Executar ou do diretório de outro usuário estava funcionando bem.

Removi o arquivo do meu usuário e o problema foi resolvido!

    
por 06.01.2010 / 15:08
0

Iniciar funciona, mas agora a janela aberta pelo arquivo de lote é alterada das opções que eu tinha e as "propriedades" estão desabilitadas (não respondem).

    
por 17.03.2010 / 21:08
0

Basta redirecionar o stdin do lote para nulo adicionando < nul até o final do comando.

    
por 22.02.2011 / 17:15
0

Eu corri para isso com um EXE que parecia lançar ^ C para o lote pai na saída, causando o prompt "Terminate Batch Job", mesmo em uma saída limpa.

A solução que escolhi para usar foi executar o lote com "Iniciar", semelhante a outras respostas, mas a partir de um prompt do PowerShell (ou por meio do método do interpretador do PowerShell do CMD, se você escolher).

Agora é 2018, e no Windows 10 a Microsoft começou a suplantar o CMD com o PowerShell como o prompt de comando preferido, por isso está prontamente disponível na GUI, por padrão.

Start é um alias para Start-Process .

Quando executado, apenas inicia e retorna. Portanto, quando você interromper o processo iniciado, não haverá um prompt "Encerrar trabalho em lote".

Por padrão, ele não espera, portanto, nenhum argumento adicional além do comando e seus argumentos são necessários.

Usar start mything.exe -mythings -arguments no meu lote funcionou perfeitamente.

No PowerShell, os scripts devem ser precedidos por seu caminho a ser iniciado, portanto, executo meu arquivo em lote como .\host.bat .

    
por 01.02.2018 / 14:16
0

TCC / LE , que é um substituto do CMD gratuito (pense nisso como CMD ++), tem uma opção para suprimir o prompt da tarefa de término em lote. Você pode encontrar a opção na Caixa de diálogo de configuração de inicialização do TCC :

Cancel Batch File on Ctrl-C: Cancel batch file processing without the usual prompt when you press Control-C.

Screenshot:

Se você nunca ouviu falar de TCC / LE antes, aqui está uma sinopse do site:

TCC/LE is a replacement for the CMD command line (the default Windows command prompt). TCC/LE is a superset of CMD, with 111 internal commands (CMD has fewer than 40), 240 internal variables and functions, and hundreds of enhancements to existing CMD commands.

TCC/LE works with your existing command line applications and batch files, but offers major improvements in command line and batch file capabilities, and adds thousands of new features to your command prompt windows.

Eu usei o TCC / LE por anos e 4NT antes dele. Eu tenho muito amor por isso e posso recomendá-lo. A única razão pela qual eu ainda não uso é porque eu uso quase exclusivamente o PowerShell agora.

    
por 06.10.2016 / 23:18
0

Um dos principais motivos para suprimir o "Terminate batch job (Y / N)" é executar um programa em um loop (por exemplo: reexecutar no caso de travar).

Este link ajudou a levar a essa solução:

@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
)
    
por 04.10.2018 / 00:34
-1

A maneira mais fácil de suprimir a confirmação, se você usar o terminal Hyper , é adicionar o hiper-sim plugin.

    
por 20.09.2018 / 12:54
-2

No final do seu script, basta adicionar o seguinte comando: echo
Isso não "danificará" o comportamento do seu script e parece impedir que o CDM pergunte se você deseja encerrar o lote.

    
por 19.11.2010 / 12:13