Como parar um processo de bat no Windows?

11

Eu tenho o arquivo BAT sendo executado em segundo plano no Windows, que dura cerca de dez minutos. Agora quero interrompê-lo enquanto estiver em execução, mas não consigo encontrar o nome na lista de processos no gerenciador de tarefas. Então, como posso abordar isso? Obrigado!

UPDATE1

Parece difícil parar um processo BAT em execução no backgroud.E eu decido tentar matar todos os processos envolvidos pelo arquivo BAT por nome, o que pode ser um exagero.É aceitável para mim, uma vez que a maioria dos processos no meu arquivo BAT não é usada com frequência, como ping, tracert, netstat etc. Se você tiver alguma solução melhor, por favor me avise.

UPDATE2

Árvore de processos BAT

texto alternativo

SpawnST
fonte
11
Como você fez o arquivo bat ser executado em segundo plano? você diz que não pode fazer ctrl-c. eu tentaria break = on se isso não funcionar, mas você diz que não pode fazer ctrl-c porque está "em segundo plano". Talvez ele já tenha terminado e você tenha que matar o que gerou.
barlop
2
@ barlop, pode ser extraído no backgroud com ShellExecute(NULL,"open","some.bat",NULL,NULL,SW_HIDE);no VC ++.
SpawnST

Respostas:

11

Os processos geralmente são iniciados em uma árvore como a moda. Recomendaria iniciar o Microsoft / Sysinternals Process Explorer . Comece clicando na Show Process Treeopção (1), encontre o processo e clique com o botão direito do mouse e escolha Kill Process Tree(2) Isso deve matar o arquivo original e tudo o que lançou.

texto alternativo

William Hilsum
fonte
Matar a Árvore de Processos parece um pouco pesado. Pode ser suficiente para matar o processo pai (o comando bat).
wag2639
11
@ wag2639, depois de ler a pergunta, pensei que ele queria encerrar o BAT e os processos gerados? Quando se diz que leva muito tempo para processar, eu entendo que à medida que os processos são iniciados e nada acontece até que eles escrevam uma resposta ... Se a árvore não terminar, haverá apenas um monte de processos em execução que são executados. fazendo nada.
William Hilsum
Eu tentei dessa maneira e adicionei a figura na minha resposta.Obrigado.E agora, encontro um comando que pode matar um processo iniciado pelo arquivo BAT e seus filhos taskkill /F /T /IM cmd.exe. O único problema é que todo arquivo BAT iniciará um cmd.exeprocesso com PID diferente .Eu preciso descobrir qual é o meu alvo.
SpawnST
@SpawnST, que processo está iniciando o arquivo BAT? Você precisa matar o item que está iniciando, se houver várias cópias.
William Hilsum
@ Wil, é iniciado por um processo MFC / Dialog. A caixa de diálogo só executa o arquivo BAT com o shell da janela quando é inicializada. Agora, estou tentando garantir que o processo BAT seja temperado completamente quando a caixa de diálogo sair.
SpawnST
5

Você pode modificar o arquivo em lotes para que ele use um arquivo de bloqueio para continuar operando, inserindo verificações entre os comandos quanto à existência do arquivo. Para interromper a execução do arquivo em lotes, basta excluir o arquivo de bloqueio.

Aqui está um arquivo em lote de demonstração:

echo xx > "c:\temp\lockfile"
pause
if not exist "c:\temp\lockfile" goto  exit
pause
del "c:\temp\lockfile"
:exit

Para eliminar violentamente os processos que podem estar em execução no momento, você pode criar um arquivo em lote 'kill' que conterá comandos de taskkill para todas as tarefas possivelmente iniciadas a partir do arquivo em lote:

del "c:\temp\lockfile"
taskkill /im mytask1.exe
taskkill /im mytask2.exe
harrymc
fonte
Essa é uma boa ideia. Mas acho que pode causar algum problema ao meu aplicativo quando um comando é executado por um longo tempo, tracertpor exemplo.
SpawnST
Sim, é isso que estou fazendo agora, realmente violento :-) E talvez o arquivo de bloqueio não seja necessário nesta solução.
SpawnST
É necessário que o arquivo em lotes não execute a próxima tarefa quando a atual for finalizada. Caso contrário, pode acontecer que a tarefa1 seja encerrada e a tarefa2 seja iniciada após o término da tarefa, portanto o lote final simplesmente perderá a tarefa2.
harrymc
1

Um BAT normalmente apenas inicia uma instância do CMD.exe. Dependendo do que o seu script faz, ele também iniciará outros processos.

vcsjones
fonte
Então, existe alguma maneira de impedir que ele continue iniciando outros processos?
precisa saber é o seguinte
11
@SpawnST: Se a janela CMD estiver visível, você não pode simplesmente digitar CTRL + C?
#
@ jason404, como mencionei na pergunta, está sendo executado em segundo plano.
SpawnST
1

Eu escrevi um aplicativo que pode ajudá-lo, pelo menos se o BAT estiver sendo executado em uma janela CMD. Você pode visualizar as janelas do aplicativo em execução e obter o PID do aplicativo, depois matá-lo com o meu aplicativo, também pode ver todos os processos que ele gerou e matá-los também. É um programa realmente simples, mas eficaz para esse tipo de coisa. Você também pode usá-lo para rastrear exatamente de onde o HD está executando o arquivo BAT, caso você ainda não saiba.

MaQleod
fonte
Estou fazendo este trabalho com VC ++ / MFC e acho que preciso de alguns comandos do Windows para fazê-lo. Obrigado pela resposta.
precisa saber é o seguinte
1

Como o arquivo em lotes é chamado?
Se for do Agendador de tarefas, você também poderá interrompê-lo. Se for de um serviço, você poderá interromper o serviço.

Weismat
fonte
0

Se você o abrir no prompt de comando, pressione Ctrl+ C. Aguarde alguns segundos e ele será encerrado.

harvey hopkins
fonte