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
- Comment démarrer GNU Octave avec l’interface graphique via Cygwin à partir d’une icône de bureau?
- Montez le fichier .iso Windows 8 avec un fichier de commandes
- VBScript pour créer une tâche planifiée
- Connectez-vous actuellement à l’utilisateur sous Windows
- Windows batch file se termine lors de l’exécution de commandes mercurial
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" }