Questão Como suprimir a confirmação "Encerrar trabalho em lote (S / N)"?


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


125


origem


Você já tentou a resposta do sgmoore? superuser.com/questions/35698/… - Arjan
"Eu nunca consigo me lembrar de uma instância em que optei por não encerrar o trabalho em lote." E, na verdade, na maioria dos casos, o trabalho é finalizado mesmo se você responder Não ... - PhiLho
@PhiLho - Isso não pode ser verdade, pois meus scripts sempre continuam depois que eu digito N. Estou curioso sobre qual cenário você tem onde o script em lote termina depois que você entra N. - dbenham
Eu estava esperando que isso fosse fácil, mas, como de costume, a Microsoft fez algo simples, uma dor na bunda. As respostas abaixo estão gastando muito esforço para evitar esse aborrecimento menor. Estou apenas irritado que não há uma maneira simples de resolver isso. Sério Microsoft, qual é o ponto deste prompt? Sim, tenho certeza, é por isso que toquei em Ctrl + C ... - Chev
Este problema está, pelo menos, fazendo com que eu me lembre e faça uso do -n mudar para cygwin ping mais frequentemente. - palswim


Respostas:


AFAIK você não pode, pois esse comportamento é por design e controlado pelo interpretador de comandos. Não existe um método de "mapeamento" ou mesmo "interceptação" a menos que você descompile e recompile o interpretador diretamente.


40



Isso é decepcionante :( - Srikanth
Sim, é decepcionante. O que é ainda mais decepcionante é que o comando BREAK, que por padrão não faz nada no XP, poderia ter sido usado para ativar o prompt… - Synetech
Embora possa ser verdade, não se pode fazer com que o intérprete se comporte de maneira diferente, usando start como sgmoore sugerido em superuser.com/questions/35698/… parece uma solução perfeita para mim. - Arjan
Aqui está: superuser.com/a/498798/56101 - Totty.js


pressione Ctrl+C duas vezes.


51



Isso não funcionará, mas repete o prompt. - Joey
funcionou perfeitamente para mim, obrigado! - captainclam
Acabei de matar meu banco de dados fazendo isso! O script estava esperando em "pausa", então eu fiz CTRL-C, e então o prompt veio, então eu fiz o CTRL-C novamente, e então o arquivo de lote continuou e excluí meu banco de dados! @Vejo superuser.com/questions/740004/… - Sebastien Diot
@vladr é infinitamente mais fácil de segurar Ctrl e toque em C novamente contra bater Y então Enter. - Nick T
@SebastienDiot Você experimentou uma nova técnica em um script que tinha o potencial de destruir permanentemente os dados? Isso é ... corajoso. - Basic


Neste local, 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
)

41



Se você chamar um arquivo em lote de dentro dele mesmo (sem usar o comando CALL), a execução será transferida "permanentemente". Se STDIN for redirecionado para NUL, qualquer prompt "Terminate Batch Job" continuará a aparecer, mas não esperará (porque STDIN desapareceu) para entrada. Isso funciona para mim ... - William
Isso funciona no Windows 7. - William
Funciona, a menos que você precise de entrada do usuário no lote. - Augusto Men
@William, Acabei de chamar o script não funcionou para mim, mas eu vim com uma solução alternativa: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Chama-se recursivamente, mas com um argumento pela segunda vez. Se o seu script tiver argumentos, você poderá usar o primeiro argumento posicional não usado. Isso pode ser problemático se o seu script tiver muitos argumentos. Meu script não precisava de argumentos ou entrada do usuário. - jpmc26
A resposta do jpmc funcionou para mim. Ele faz eco do maldito Terminate (y / n)? mensagem no final, porém, mas não para. - ggb667


Instalar Tinido e altere a configuração "terminate_autoanswer". O arquivo de configurações deveria ser 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.

Frickin 'awesome, IMO!


22



O Clink é fantástico, mas isso não funciona para mim, usando o cmd.exe ou o Console2. Ele ainda pergunta e não fica preenchido automaticamente. - iono
@tometoftom: Você alterou o arquivo de configurações como acima? Eu tive que fazer isso para que funcionasse. (Note que você tem que ser um administrador para salvar o arquivo corretamente no Windows Vista e acima ...) - Macke
Sim, com as configurações alteradas. Eu sou um administrador :( Eu tentei fazer o equivalente a "Executar como Administrador" para executáveis, fazendo um atalho do arquivo de configurações, clique com o botão direito -> Propriedades, guia Atalho, Avançado ... então "Executar como Administrador" é acinzentado. - iono
Ah, ainda não há dados. suspiro profundo Microsoft, pelo amor de Deus ... - iono
@iono você tem versão do Windows não em inglês? Nesse caso, o clink não pôde responder automaticamente ao prompt até a versão 0.4.3 há alguns dias: github.com/mridgers/clink/releases/tag/0.4.3 - schlamar


Se você não precisa fazer nada no arquivo de lote após o término do aplicativo normalmente, use o start comando 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
definir my_params = -t www.google.com

echo Comando a ser executado por 'start':% my_command%% my_params%

:: Quando NÃO estiver usando / B ou / WAIT, isso criará uma nova janela, enquanto
:: a execução deste mesmo arquivo de lote continuará na janela atual:

inicie% my_command%% my_params%

eco.
echo Esta linha será executada ANTES que 'start' seja terminada. Então, é isso
O arquivo de lote de eco será concluído ANTES de um pressionar Ctrl-C na outra janela.
eco.

:: Apenas para testar use 'pause' para mostrar "Pressione qualquer tecla para continuar", para ver
:: a saída dos comandos 'echo'. Certifique-se de pressionar Ctrl-C na janela
:: que executa o comando 'ping' (não nesta mesma janela). Ou simplesmente remover
:: a próxima linha quando confuso:

pausa

(Testado no Windows XP).


15



Não sei se start de fato ajudaria, mas soa plausível para mim. Então eu me pergunto se o downvote implica que isso não funcionaria? Ou quem sabe downvoted não conhece o Windows start (ou especialmente start /wait e start /b) comando? Vejo microsoft.com/resources/documentation/windows/xp/all/proddocs/… então. Por favor, explique o downvote? - Arjan
start não vai funcionar. Sempre que o cmd estiver executando um arquivo em lote, tocar em Ctrl + C fará com que o processo atualmente em execução seja encerrado e mostre a pergunta. - Joey
+1 funciona para mim. No entanto, / b desativa o controle Ctrl + C (que é irritante). - Nick Bolton
Isso é bom se você clicar duas vezes no arquivo de lote. Mas e se você iniciar o arquivo em lote no console? - Helgi
(Falando do Windows 7, não tenho certeza se aplicável ao XP) irrefletido desenvolvedor contratado por Microsoft codificar o start comando fez a decisão estúpida de fazer o título da janela obrigatória e opcional ao mesmo tempo - de uma maneira bastante confusa. Então, se alguma vez você %my_command%está entre aspas duplas, torna-se o título da janela e o primeiro param em %my_params% torna-se o comando. Para ser seguro, use start "some title here" %my_command% %my_params%. A maioria apenas usa "" e amaldiçoar o desenvolvedor por não usar um /TITLE ou /T opção em vez de definir o título. - ADTC


Eu tenho lutado com esse desejo de evitar o prompt "Terminate batch job" por um tempo.

Minha última epifania é um pouco de truque (ou janela de console), substituindo uma instância de cmd.exe com outro. Isto é conseguido executando o comando / programa via start cmd /k seguido imediatamente por exit no .BAT Arquivo.

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

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

@echo off

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

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

A substituição do ambiente por um novo interpretador de comandos pode não ser para todos, mas, a olho nu, parece e funciona bem para mim.


12



+1 Uma abordagem muito nova e embora eu concorde que ti não é um substituto exato, funciona bem (embora você tenha me preocupado quando você começou seu post com "substituindo cmd.exe" - alarmes de segurança estavam tocando até que cheguei ao exemplo e percebi o que você quis dizer) - Basic
você deveria usar exit /b para sair do script em lote - Sebastian Godelet
@SebastianGodelet: Esse é um bom conselho em geral, mas aqui a intenção é fechar o console (original) janela, dado que o comando de destino é lançado em um Novo janela. - mklement0


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

Aqui está 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.


7



Isso não vai funcionar se myscript.py quer ler de stdin. - jamesdlin


Vejo esta pergunta de estouro de pilha.

No entanto, patching cmd.exe não é algo que eu faria para isso.


5





No meu caso, foi o arquivo ping.bat que estava certo no meu diretório de usuário (C: \ Users \ no Vista ou C: \ Documents and Settings \ no XP) que estava segurando 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.

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


0





Comece a funcionar, 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).


0