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?
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
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.
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
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