web-dev-qa-db-fra.com

Programme batch pour vérifier si le processus existe

Je veux un programme batch, qui vérifiera si le processus notepad.exe existe.

sinotepad.exe existe, il mettra fin au processus,

else le programme batch se fermera.

Voici ce que j'ai fait:

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

Mais ça ne marche pas. Quel est le problème dans mon code?

26
user2176930

TASKLIST ne définit pas le niveau d'erreur.

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

devrait faire le travail, car ":" ne devrait apparaître dans la sortie TASKLIST que si la tâche N'EST PAS trouvée, donc FIND définira le niveau d'erreur sur 0 pour not found et 1 pour found

Cependant,

taskkill/f/im "notepad.exe"

va tuer une tâche du bloc-notes si elle existe - elle ne peut rien faire si aucune tâche du bloc-notes n'existe, donc vous n'avez pas vraiment besoin de tester - à moins qu'il y ait autre chose que vous voulez faire ... comme peut-être

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

qui semble faire ce que vous demandez - tuez le processus du bloc-notes s'il existe, puis quittez - sinon continuez avec le lot

52
Magoo

Il s'agit d'une solution à une ligne.

Il exécutera taskkill uniquement si le processus est réellement en cours d'exécution, sinon il indiquera simplement qu'il n'est pas en cours d'exécution.

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

C'est la sortie au cas où le processus était en cours d'exécution:

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

C'est la sortie en cas de non fonctionnement:

process "notepad.exe" not running.
15
nicovota

TASKLIST ne définit pas de code de sortie que vous pouvez archiver dans un fichier batch. Une solution de contournement pour vérifier le code de sortie pourrait être l'analyse de sa sortie standard (que vous redirigez actuellement vers NUL). Apparemment, si le processus est trouvé, TASKLIST affichera ses détails, qui incluent également le nom de l'image. Par conséquent, vous pouvez simplement utiliser FIND ou FINDSTR pour vérifier si la sortie de TASKLIST contient le nom que vous avez spécifié dans la demande. FIND et FINDSTR définissent un code de sortie non nul si la recherche a échoué. Donc, cela fonctionnerait:

@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

Il existe également une alternative qui n'implique pas du tout TASKLIST. Contrairement à TASKLIST, TASKKILL définit un code de sortie. En particulier, s'il ne pouvait pas terminer un processus parce qu'il n'existait tout simplement pas, il définirait le code de sortie de 128. Vous pouvez vérifier ce code pour effectuer vos actions spécifiques que vous pourriez avoir besoin d'exécuter au cas où le processus spécifié n'existait pas:

@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
9
Andriy M

C'est pourquoi cela ne fonctionne pas parce que vous codez quelque chose qui ne va pas, c'est pourquoi il se ferme toujours et l'exécuteur de script le lira comme un fichier batch non opérationnel qui l'empêche de se fermer et de s'arrêter, donc il doit être

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
)

plutôt que

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