2013-03-16 20 views
24

Desidero un programma batch, che verificherà se il processo è notepad.exe.Programma batch su per verificare se il processo esiste

senotepad.exe esiste, finirà il processo,

altro il programma batch si chiuderà.

Ecco quello che ho fatto:

@echo off 
tasklist /fi "imagename eq notepad.exe" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe" 
exit 

Ma non funziona. Cosa c'è di sbagliato nel mio codice?

+1

Perché non si chiama 'taskkill' senza verificare se l'attività esiste? –

+2

'taskkill' non cambia il errorlevel per me ... – user2033427

+0

@Andriy M Voglio controllare se il processo esiste. quindi terminare il processo o chiudersi. – user2176930

risposta

41

TASKLIST non imposta errorlevel.

echo off 
tasklist /fi "imagename eq notepad.exe" |find ":" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe" 
exit 

dovrebbe fare il lavoro, dal momento che ":" dovrebbe apparire in TASKLIST uscita solo se l'operazione non viene trovato, quindi FIND sarà impostare l'errorlevel per 0 per not found e 1 per found

Tuttavia,

taskkill/f/im "notepad.exe"

uccide un compito blocco note se esiste - si può fare nulla se non il blocchetto per appunti esiste compito, in modo da non ha realmente bisogno di testare - a meno che non ci sia qualcos'altro che vuoi fare ... come forse

echo off 
tasklist /fi "imagename eq notepad.exe" |find ":" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe"&exit 

che sembrerebbe di fare come si chiede - uccidere il processo notepad se esiste, quindi esci - altrimenti continua con il lotto

+4

Invece di controllare "if errorlevel', questo può essere ulteriormente semplificato con [esecuzione condizionale] (http://www.robvanderwoude.com/condexec.php). – rojo

+2

Forse è meglio 'trovare" notepad.exe "' poiché l'output è tradotto e non possiamo essere sicuri che ':' appaia in tutte le lingue. –

8

TASKLIST non imposta un codice di uscita che è possibile archiviare in un file batch. Una soluzione alternativa per controllare il codice di uscita potrebbe essere l'analisi del suo output standard (che stai attualmente reindirizzando a NUL). Apparentemente, se il processo viene trovato, TASKLIST visualizzerà i suoi dettagli, che includono anche il nome dell'immagine. Pertanto, è possibile utilizzare semplicemente FIND o FINDSTR per verificare se l'output di TASKLIST contiene il nome specificato nella richiesta. Entrambi FIND e FINDSTR impostano un codice di uscita non nullo se la ricerca non ha avuto esito positivo. Quindi, questo dovrebbe funzionare:

@echo off 
tasklist /fi "imagename eq notepad.exe" | find /i "notepad.exe" > nul 
if not errorlevel 1 (taskkill /f /im "notepad.exe") else (
    specific commands to perform if the process was not found 
) 
exit 

C'è anche un'alternativa che non comporta TASKLIST affatto. A differenza di TASKLIST, TASKKILL imposta un codice di uscita. In particolare, se non fosse in grado di terminare un processo perché semplicemente non esisteva, imposterà il codice di uscita di 128. È possibile controllare quel codice per eseguire le azioni specifiche che potrebbe essere necessario eseguire nel caso in cui il processo specificato non esisteva:

@echo off 
taskkill /f /im "notepad.exe" > nul 
if errorlevel 128 (
    specific commands to perform if the process was not terminated because it was not found 
) 
exit 
+0

Ho trovato se il nome dell'immagine, include l'estensione del file, oltre 25 caratteri, la colonna "Nome immagine" nell'output della tasklist verrà troncata, il che rende il comando "trova" con nome immagine non funzionante. Tuttavia, rilevare solo dal carattere ":" sembra troppo lento, temo che possa accadere nel risultato positivo delle versioni future. C'è qualche altro modo migliore per farlo? – Elliott

+1

@Elliott: se si memorizza il nome dell'eseguibile in una variabile, è possibile utilizzare l'intero valore in 'tasklist' e solo i primi 25 caratteri in' find': 'tasklist/fi" nomeimmagini eq% imgname% "| find/i "% imgname: ~ 0,25%"> nul' –

+0

Grazie mille! :) – Elliott

-3

Prova questa:

@echo off 
set run= 
tasklist /fi "imagename eq notepad.exe" | find ":" > nul 
if errorlevel 1 set run=yes 
if "%run%"=="yes" echo notepad is running 
if "%run%"=="" echo notepad is not running 
pause 
11

questa è una soluzione una riga.

Verrà eseguito taskkill solo se il processo è in esecuzione, altrimenti verranno visualizzate solo le informazioni che non è in esecuzione.

tasklist | find /i "notepad.exe" && taskkill /im notepad.exe /F || echo process "notepad.exe" not running. 

Questa è l'uscita nel caso in cui il processo è stato in esecuzione:

notepad.exe   1960 Console     0 112,260 K 
SUCCESS: The process "notepad.exe" with PID 1960 has been terminated. 

Questa è l'uscita nel caso in cui non è in esecuzione:

process "notepad.exe" not running. 
+0

non funziona per me –

+1

per me funziona in Windows 10, lo uso in diversi script. – nicovota

+0

forse mi sono perso qualcosa –

-1

Ecco perché non funziona perché è qualcosa di codice non è giusto, è per questo che esce sempre e lo script executer lo leggerà come file batch non eseguibile che impedisce l'uscita e lo stop quindi deve essere

tasklist /fi "IMAGENAME eq Notepad.exe" 2>NUL | find /I /N "Notepad.exe">NUL 
if "%ERRORLEVEL%"=="0" (
msg * Program is running 
goto Exit 
) 
else if "%ERRORLEVEL%"=="1" (
msg * Program is not running 
goto Exit 
) 

piuttosto che

@echo off 
tasklist /fi "imagename eq notepad.exe" > nul 
if errorlevel 1 taskkill /f /im "notepad.exe" 
exit 
0
QPROCESS "myprocess.exe">NUL 
IF %ERRORLEVEL% EQU 0 ECHO "Process running" 

Il codice di cui sopra è stato testato in Windows 7, con un utente con rigths amministratore.

Problemi correlati