Come fermare un processo bat su Windows?


11

Ho un file BAT in esecuzione su Windows che dura circa dieci minuti. Ora voglio fermarlo mentre è in esecuzione, ma non riesco a trovare il suo nome nell'elenco dei processi nel task manager. Quindi, come posso affrontare questo? Grazie!

Update1

Mi sembra difficile interrompere un processo BAT in esecuzione in backgroud e decido di provare a terminare ogni processo coinvolto dal file BAT in base al nome, che può essere eccessivo. Per me è accettabile poiché la maggior parte dei processi nel mio file BAT non vengono utilizzati frequentemente come ping, tracert, netstat ecc. Se hai una soluzione migliore per favore fatemelo sapere. Grazie.

UPDATE2

Albero dei processi BAT

testo alternativo


1
Come hai eseguito il file bat in background? dici che non puoi fare ctrl-c. proverei break = on se non funziona, ma dici che non puoi fare ctrl-c perché è "in background". Forse è già funzionato e finito, e devi solo uccidere ciò che ha generato.
barlop il

2
@ barlop, può essere escluso in backgroud con ShellExecute(NULL,"open","some.bat",NULL,NULL,SW_HIDE);in VC ++.
SpawnST

Risposte:


11

I processi di solito vengono avviati in un albero come la moda, consiglierei di avviare Microsoft / Sysinternals Process Explorer , Inizia facendo clic Show Process Treesull'opzione (1), quindi trova il tuo processo e fai clic con il tasto destro e scegli Kill Process Tree(2) Questo dovrebbe uccidere sia il file originale che tutto ciò che ha lanciato.

testo alternativo


Uccidere l'albero dei processi sembra un po 'pesante. Potrebbe essere sufficiente uccidere il processo genitore (il comando bat).
wag2639,

1
@ wag2639, dopo aver letto la domanda, ho pensato che volesse porre fine alla BAT e generato processi? Quando si dice che ci vuole così tanto tempo per l'elaborazione, capisco che quando i processi vengono avviati e quindi non accade nulla finché non scrivono una risposta ... Se l'albero non è terminato, ci saranno solo un sacco di processi in esecuzione che sono facendo nulla.
William Hilsum,

Ho provato in questo modo e ho aggiunto l'immagine nella mia risposta.Grazie.E ora trovo un comando che può uccidere un processo avviato dal file BAT e dai suoi figli taskkill /F /T /IM cmd.exe. L'unico problema è che ogni file BAT avvierà un cmd.exeprocesso con PID diverso Devo capire quale sia il mio obiettivo.
SpawnST

@SpawnST, quale processo sta avviando il file BAT? Devi uccidere l'elemento che lo sta lanciando, quindi se ci sono più copie.
William Hilsum,

@ Wil, è avviato da un processo MFC / Dialog. La finestra di dialogo esegue il file BAT con la shell della finestra solo quando è inizializzata. Ora sto cercando di assicurarmi che il processo BAT sia completamente teminato quando si chiude la finestra di dialogo.
SpawnST

5

È possibile modificare il file batch in modo che utilizzi un file di blocco per continuare a funzionare, inserendo i controlli tra i comandi per l'esistenza del file. Per interrompere l'esecuzione del file batch, è sufficiente eliminare il file di blocco.

Ecco un file batch demo:

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

Per uccidere violentemente i processi che potrebbero essere in esecuzione al momento, è possibile creare un file batch "kill" che conterrà i comandi taskkill per tutte le attività eventualmente avviate dal file batch:

del "c:\temp\lockfile"
taskkill /im mytask1.exe
taskkill /im mytask2.exe

Questa è una buona idea, ma penso che potrebbe causare qualche problema alla mia app quando un comando viene eseguito a lungo, tracertad esempio.
SpawnST

sì, è quello che sto facendo ora, davvero violento :-) E forse il file di blocco non è necessario in questa soluzione.
SpawnST

È necessario in modo che il file batch non esegua l'attività successiva al termine di quella corrente. Altrimenti potrebbe accadere che task1 sia terminato e task2 venga avviato dopo che la sua taskkill è già stata eseguita, quindi il batch di kill semplicemente perderà task2.
harrymc,

1

Una BAT in genere avvia solo un'istanza di CMD.exe. A seconda di ciò che fa lo script, verranno avviati anche altri processi.


Quindi c'è un modo per fermarlo mantenendo l'avvio di altri processi?
Spawn

1
@SpawnST: se la finestra CMD è visibile, non puoi semplicemente digitare CTRL + C?
paradroid

@ jason404, come ho detto nella domanda, è in esecuzione in background.
SpawnST

1

Ho scritto un'app che potrebbe aiutarti, almeno se la BAT è in esecuzione in una finestra CMD. Puoi visualizzare le finestre dell'applicazione in esecuzione e ottenere il PID dell'app, quindi puoi ucciderlo con la mia app, puoi anche vedere tutti i processi che ha generato e anche ucciderli. È un programma davvero semplice, ma efficace per questo genere di cose. Puoi anche usarlo per rintracciare esattamente da dove viene eseguito il file BAT sul tuo HD, nel caso in cui non lo sapessi già.


Sto facendo questo lavoro con VC ++ / MFC e penso di aver bisogno di alcuni comandi di Windows per farlo. Grazie per la risposta.
Spawn

1

Come viene invocato il file batch?
Se proviene dall'Utilità di pianificazione, è possibile arrestarlo anche da lì. Se proviene da un servizio, è possibile interrompere il servizio.



0

Se lo hai aperto nel prompt dei comandi puoi premere Ctrl+ C. Attendi qualche secondo e verrà chiuso.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.