Tuer un processus dans Batch et rendre compte de la réussite

J’ai le fichier de commandes suivant, qui termine le programme iTunes de sorte que si je connecte mon iPod, il ne va pas le synchroniser. (Je sais que vous pouvez configurer cela dans iTunes.)

@echo off :kill cls taskkill /F /IM itunes.exe >nul if %errorlevel%==1 { echo iTunes not found. } else { echo iTunes is killed. } goto kill 

Cependant, le >nul ne répond pas à la commande; il donne donc simplement le texte de commande par défaut. Alors oui, ce que je veux faire:

Si iTunes n’est pas trouvé, comme indiqué par la commande, il devrait afficher

iTunes introuvable

S’il est trouvé et terminé,

iTunes est tué

Aidez-moi? le niveau d’erreur ne fonctionne pas, cela semble être la faute du nul ne fonctionne pas.

Fonctionne pour moi au moins:

  > taskkill / f / im powershell.exe && echo works ||  echo pas travaillé
 SUCCESS: Le processus "powershell.exe" avec le PID 3228 a été terminé.
 travaillé

 > taskkill / f / im powershell.exe && echo works ||  echo pas travaillé
 ERREUR: Le processus "powershell.exe" est introuvable.
 pas travaillé 

Donc, taskkill renvoie un code de sortie correct. La redirection de sa sortie n’a rien à voir avec cela. Mais le niveau d’erreur pour l’échec est 128. Vous devez vraiment utiliser l’idiome approprié pour rechercher les erreurs.

En outre, il semble que taskkill imprime sur stderr pour que vous puissiez toujours voir sa sortie, simplement lorsque vous redirigez stdout . Vous pouvez envisager de réécrire le code ci-dessus pour:

 taskkill /F /IM itunes.exe >nul 2>&1 if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.) 

Le 2>&1 redirige la sortie d’erreur standard dans le vaste néant. if errorlevel 1 vérifie que le niveau d’ errorlevel est au moins égal à 1, cela devrait fonctionner à ce stade:

Numéro ERRORLEVEL Spécifie une condition vraie si le dernier programme exécuté a renvoyé un code de sortie égal ou supérieur au nombre spécifié. – help if

En général, vérifier errorlevel avec if %errorlevel%== est une très mauvaise idée, à moins que vous ne compariez à 0. La sémantique des codes de sortie est que anything qui est non nul signale une défaillance. Votre hypothèse était simplement que taskkill retournerait 1 en cas d’échec.

Puis-je demander avec bonté pourquoi vous le faites en boucle sans fin? taskkill tue déjà toutes les instances de itunes.exe . Et vous exécutez une boucle serrée sans aucun délai, de sorte que vos fichiers batch consumnt probablement un cœur de processeur pendant son fonctionnement.

ETA: Oublié votre édition: Pourquoi des accolades bouclés? Les blocs dans les fichiers de commandes sont supprimés par des parenthèses.

une solution alternative, en vbscript, à enregistrer sous le code mykill.vbs

 Set objArgs = WScript.Arguments strProcess = objArgs(0) strComputer = "." Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name ='" & strProcess & "'") If colProcesses.Count = 0 Then Wscript.Echo strProcess & " is not running." Else Wscript.Echo strProcess & " is running." 'Kill the process For Each objProcess in colProcesses r=objProcess.Terminate() WScript.Echo "r is " & r If r = 0 Then WScript.Echo strProcess & " killed" End If Next End If 

sur la ligne de commande

 c:\test> cscript //nologo mykill.vbs "itunes.exe" 

Pourquoi n’utilisez-vous pas PowerShell?

 try { Stop-Process -Name itunes -ErrorAction Stop "iTunes is killed" } catch { "iTunes not found" }