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?
windows
command-line
batch
Srikanth
fonte
fonte
N
. Estou curioso para saber qual cenário você tem onde o script em lote termina após a entradaN
.-n
switch para cygwin ping com mais frequência.Respostas:
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.
fonte
start
como sgmoore sugerido em superuser.com/questions/35698/… parece uma solução perfeita para mim.Pressione Ctrl+ Cduas vezes.
fonte
Ctrl
e tocarC
novamente contra baterY
em seguidaEnter
.Neste site , encontrei uma solução eficaz:
Para não precisar digitar isso toda vez, criei um segundo script chamado
script.cmd
na 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:
fonte
@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.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
.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!
fonte
\cmder\config\settings
. Veja o problema relacionado aqui github.com/cmderdev/cmder/issues/1666 #Se você não precisar fazer nada no arquivo em lotes depois que o aplicativo terminar normalmente, o uso do
start
comando garantirá que o arquivo em lote já esteja concluído quando você pressionar Ctrl-C. E, portanto, a mensagem não aparecerá.Por exemplo:
(Testado no Windows XP.)
fonte
start
isso 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 Windowsstart
(ou especialmentestart /wait
estart /b
)? Consulte microsoft.com/resources/documentation/windows/xp/all/proddocs/… então. Por favor, explique o voto negativo?start
nã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.start
comando 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, usestart "some title here" %my_command% %my_params%
. A maioria simplesmente usa""
e amaldiçoa o desenvolvedor por não usar uma opção/TITLE
ou/T
para definir o título.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.exe
por outra. Isso é realizado executando o comando / programa viastart cmd /k
seguido imediatamente porexit
no.BAT
arquivo.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
traceroute
que pode ser interrompido por Ctrl+ Cou com permissão para concluir, retornando o usuário aoC:\>
prompt: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.
fonte
exit /b
para sair do script em lotesA solução do Gringo é boa, mas não funciona bem com scripts que passam pela lista de argumentos (ou seja
python myscript.py %*
), poisSHIFT
não são atualizados%*
. Existem soluções alternativas , mas elas têm certas limitações.Aqui está a modificação que eu acabei com:
99. (9)% sem falhas.
fonte
myscript.py
quiser ler do stdin.Veja esta questão de estouro de pilha .
No entanto, corrigir o cmd.exe não é algo que eu faria por isso.
fonte
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!
fonte
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).
fonte
Simplesmente redirecione o lote stdin para null adicionando <nul ao final do comando.
fonte
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 -arguments
no 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
.fonte
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 :
Captura de tela:
Se você nunca ouviu falar de TCC / LE antes, aqui estão algumas informações do site:
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.
fonte
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:
fonte
A maneira mais fácil de suprimir a confirmação se você usar o terminal Hyper , é adicionar o plug - in hyper-yes .
fonte
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.
fonte