Como suprimir a confirmação "Terminar trabalho em lotes (S / N)"?


154

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


Você já tentou a resposta de sgmoore? superuser.com/questions/35698/…
Arjan

10
"Nunca me lembro de uma instância em que optei por não finalizar o trabalho em lotes". E, na verdade, na maioria dos casos, o trabalho é encerrado mesmo se você responder Não ...
PhiLho

@ PhiLho - Isso não pode ser verdade, pois meus scripts sempre continuam depois que eu entro N. Estou curioso para saber qual cenário você tem onde o script em lote termina após a entrada N.
dbenham

Eu esperava que isso fosse fácil, mas, como de costume, a Microsoft tornou algo simples um pé no saco. As respostas abaixo estão gastando muito esforço para evitar esse pequeno aborrecimento. Estou apenas irritado por não haver uma maneira simples de resolver isso. Sério Microsoft, qual é o objetivo desse prompt? Sim, eu tenho certeza, é por isso que eu pressione Ctrl + C ...
Chev

Esse problema está pelo menos me fazendo lembrar e fazer uso do -nswitch para cygwin ping com mais frequência.
palswim

Respostas:


52

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


39
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 alternar entre o prompt ...
Synetech

3
Embora possa ser verdade, não se pode fazer com que o intérprete se comporte de maneira diferente, usar startcomo sgmoore sugerido em superuser.com/questions/35698/… parece uma solução perfeita para mim.
Arjan


58

Pressione Ctrl+ Cduas vezes.


5
Isso não vai funcionar, mas repete o prompt.
Joey

8
Acabei de matar meu banco de dados fazendo isso! O script estava aguardando "pausa", então eu fiz o CTRL-C e, em seguida, o prompt chegou, então eu fiz o CTRL-C novamente e, em seguida, o arquivo em lotes continuou e excluiu meu banco de dados! @see superuser.com/questions/740004/…
Sebastien Diot

2
Não foi isso que o OP pediu. Ele poderia facilmente digitar "N" depois de ^ C.
Vladr

3
@vladr é infinitamente mais fácil de segurar Ctrle tocar Cnovamente contra bater Yem seguida Enter.
Nick T

21
@SebastienDiot Você tentou uma nova técnica em um script que tinha o potencial de destruir dados permanentemente? Isso é ... corajoso.
Basic

58

Neste site , encontrei uma solução eficaz:

script2.cmd < nul

Para não precisar digitar isso toda vez, criei um segundo script chamado script.cmdna mesma pasta com a linha acima. Testei essa técnica apenas no XP, mas outros a 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
)

2
Se você chamar um arquivo em lotes de dentro de si (sem usar o comando CALL), a execução será "permanentemente" transferida. Se STDIN for redirecionado para NUL, qualquer prompt "Terminate Batch Job" ainda aparecerá, mas não esperará (porque STDIN se foi) pela entrada. Isso funciona para mim ... #
William

3
Isso funciona no Windows 7.
William

17
Funciona, a menos que você precise de entrada do usuário no lote.
Augusto Homens

2
@William, apenas chamando o script não funcionou para mim, mas eu vim com uma solução alternativa: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Chama a si próprio recursivamente, mas com um argumento na segunda vez. Se o seu script tiver argumentos, você poderá usar o primeiro argumento posicional não utilizado. Isso pode ser problemático se o seu script tiver muitos argumentos. Meu script não precisava de argumentos ou de entrada do usuário.
precisa

A resposta do jpmc funcionou para mim. Ele faz eco ao danificado Terminate (s / n)? mensagem no final, porém, mas não para.
precisa saber é o seguinte

29

Instale o 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, pois clink piggy-backs no cmd.exe.

Incrível, IMO!


O clink é fantástico, mas isso não funciona para mim, usando o cmd.exe ou o Console2. Ele ainda pergunta e não é preenchido automaticamente.
iono

@tometoftom: Você alterou o arquivo de configurações como acima? Eu tive que fazer isso para fazer funcionar. (Note que você tem que ser um administrador para salvar o arquivo corretamente no Windows Vista e até ...)
Macke

3
Ah, ainda não há dados. suspiro profundo Microsoft, pelo amor de Deus ...
iono

3
@iono você tem a versão do Windows não em inglês? Neste caso tilintar não poderia auto atender a solicitação até o lançamento 0.4.3 há poucos dias: github.com/mridgers/clink/releases/tag/0.4.3
schlamar

3
Relacionado: para aqueles que usam cmder , a configuração está ativada\cmder\config\settings . Veja o problema relacionado aqui github.com/cmderdev/cmder/issues/1666 #
edmundo096

17

Se você não precisar fazer nada no arquivo em lotes depois que o aplicativo terminar normalmente, o uso do startcomando garantirá que o arquivo em lote já esteja concluído quando você pressionar Ctrl-C. E, portanto, a mensagem não aparecerá.

Por exemplo:

@echo off

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

Comando echo 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 desse arquivo em lote continuará na janela atual:

start% my_command%% my_params%

eco.
eco Esta linha será executada ANTES que o 'start' termine. Então, é isso
O arquivo em lote de eco será concluído ANTES de 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 remova
:: a próxima linha quando confusa:

pausa

(Testado no Windows XP.)


Não sei se startisso realmente ajudaria, mas me parece plausível. Então, eu me pergunto se o voto negativo implica que isso NÃO funcionaria? Ou quem sabe quem votou mal, não conhece o comando do Windows start(ou especialmente start /waite start /b)? Consulte microsoft.com/resources/documentation/windows/xp/all/proddocs/… então. Por favor, explique o voto negativo?
Arjan

startnão vai funcionar. Sempre que o cmd estiver executando um arquivo em lotes, tocar em Ctrl + C fará com que o processo atualmente em execução seja encerrado e mostre a pergunta.
Joey

11
+1 funciona para mim. No entanto, / b desativa a manipulação de Ctrl + C (o que é irritante).
Nick Bolton

3
Tudo bem se você estiver clicando duas vezes no arquivo em lotes. Mas e se você iniciar o arquivo em lotes no console?
Helgi

8
(Falando no Windows 7, não tenho certeza se aplicável ao XP) O desenvolvedor impensado contratado pela Microsoft para codificar o startcomando tomou a decisão idiota de tornar o título da janela obrigatório e opcional ao mesmo tempo - de uma maneira bastante confusa. Portanto, se alguma vez o seu %my_command%estiver entre aspas duplas, ele se tornará o título da janela e o primeiro parâmetro %my_params%será o comando . Para estar seguro, use start "some title here" %my_command% %my_params%. A maioria simplesmente usa ""e amaldiçoa o desenvolvedor por não usar uma opção /TITLEou /Tpara definir o título.
ADTC

13

Estou lutando com esse desejo de evitar o prompt "Terminar trabalho em lotes" por um tempo.

Minha epifania mais recente é um truque (ou janela de console), substituindo uma instância cmd.exepor outra. Isso é realizado executando o comando / programa via start cmd /kseguido imediatamente por exitno .BATarquivo.

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

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

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


+1 Uma abordagem muito inovadora e, embora eu concorde que não é uma substituição exata, ela funciona bem (embora você tenha me preocupado quando começou sua postagem com "substituindo o cmd.exe" - os alarmes de segurança estavam tocando até que eu cheguei ao exemplo e percebi o que significava)
Básico

você deve usar exit /bpara sair do script em lotes
Sebastian Godelet

11
@SebastianGodelet: Esse é um bom conselho em geral, mas aqui a intenção é realmente fechar a janela do console (original) , já que o comando target é iniciado em uma nova janela.
mklement0

Por que usar "cmd / k" (mantenha o intérprete aberto) em vez de "/ c"? Apenas para poder ver a saída do comando?
Raúl Salinas-Monteagudo

9

A solução do Gringo é boa, mas não funciona bem com scripts que passam pela lista de argumentos (ou seja python myscript.py %*), pois SHIFTnão são atualizados %*. Existem soluções alternativas , mas elas têm certas limitações.

Aqui está a modificação que eu acabei com:

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

99. (9)% sem falhas.


Isso não funcionará se você myscript.pyquiser ler do stdin.
Jamesdlin


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 retendo o trabalho em lotes indeterminadamente.

Esse arquivo em lotes era executado sempre que eu executava o ping no prompt de comando, onde o diretório atual é o meu diretório de usuários. O ping da janela Executar ou do diretório de outros usuários estava funcionando bem.

O arquivo foi removido do diretório do usuário e o problema foi resolvido!


0

O início funciona, mas agora a janela aberta pelo arquivo em lotes é alterada das opções que eu tinha e as "propriedades" estão desabilitadas (não respondem).


0

Simplesmente redirecione o lote stdin para null adicionando <nul ao final do comando.


2
Eu acho que você pode ter significado <nul (como o> nul envia todos os stdout para null).
Brian Phillips

0

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

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

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

Starté um alias para Start-Process .

Quando executado, ele é iniciado e retornado. Portanto, quando você interrompe o processo iniciado, não há um prompt "Terminar 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.

Usando start mything.exe -mythings -argumentsno meu lote funcionou perfeitamente.

No PowerShell, os scripts devem ser precedidos pelo caminho para serem iniciados, portanto, eu executo meu arquivo em lotes como .\host.bat.


0

O TCC / LE , que é um substituto gratuito do CMD (pense nele como CMD ++), tem uma opção para suprimir o prompt de finalização do trabalho em lote. Você pode encontrar a opção no Diálogo de configuração de inicialização do TCC :

Cancelar arquivo em lote no Ctrl-C : cancela o processamento do arquivo em lote sem o prompt usual quando você pressiona Control-C.

Captura de tela:

Opções TCC / LE

Se você nunca ouviu falar de TCC / LE antes, aqui estão algumas informações do site:

TCC / LE é um substituto para a linha de comando do CMD (o prompt de comando padrão do Windows). O TCC / LE é um superconjunto do CMD, com 111 comandos internos (o CMD possui menos de 40), 240 variáveis ​​e funções internas e centenas de aprimoramentos nos comandos existentes do CMD.

O TCC / LE trabalha com seus aplicativos de linha de comando e arquivos em lote, mas oferece grandes melhorias nos recursos de linha de comando e arquivo em lote e adiciona milhares de novos recursos às janelas do prompt de comando.

Eu usei TCC / LE por anos e 4NT antes dele. Eu tenho muito amor por isso e posso recomendar. O único motivo pelo qual ainda não o uso é porque eu uso quase exclusivamente o PowerShell agora.


0

Um dos principais motivos para suprimir o "Finalizar trabalho em lote (S / N)" é executar um programa em um loop (por exemplo: executar novamente no caso de falha).

Este https://stackoverflow.com/a/8185270/1170023 ajudou a levar a esta 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
)


-3

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


5
Não funcionou para mim.
Helgi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.