Das Töten eines Prozesses in Batch und die Berichterstattung über Erfolg
-
19-09-2019 - |
Frage
Ich habe die folgende Batch-Datei, die so das iTunes-Programm beendet wird, dass, wenn ich meinen iPod anschließen, es wird für die Synchronisierung nicht. (Ich weiß, dass Sie dies in iTunes einrichten können.)
@echo off
:kill
cls
taskkill /F /IM itunes.exe >nul
if %errorlevel%==1 {
echo iTunes not found.
} else {
echo iTunes is killed.
}
goto kill
Allerdings ist die >nul
nicht auf den Befehl reagieren; so gibt es nur den Standard-Befehlstext. Also ja, was ich tun möchte:
Wenn iTunes nicht gefunden wird, wie durch den Befehl gegeben, sollte es angezeigt
iTunes nicht gefunden
Wenn es gefunden wird, und beendet,
iTunes wird getötet
Hilfe? die Fehlerebene des nicht funktionieren, dies scheint die Schuld des nul
zu sein, nicht zu arbeiten.
Lösung
Funktioniert bei mir zumindest:
> taskkill /f /im powershell.exe && echo worked || echo not worked SUCCESS: The process "powershell.exe" with PID 3228 has been terminated. worked > taskkill /f /im powershell.exe && echo worked || echo not worked ERROR: The process "powershell.exe" not found. not worked
So taskkill
ist Rückkehr einen richtigen Exit-Code. Die Umleitung von seinem Ausgang hat nichts damit zu tun. Aber die Fehlerebene für das Scheitern ist 128. Sie sollten wirklich die richtige Idiom verwenden, um Fehler zu überprüfen.
Auch scheint es, dass taskkill
stderr
druckt, so dass Sie seine Ausgabe sehen nach wie vor, wenn nur stdout
umleitet. Sie können prüfen, über Code umschreiben zu:
taskkill /F /IM itunes.exe >nul 2>&1
if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.)
Die 2>&1
leiten die Standard-Fehlerausgabe in das große Nichts. if errorlevel 1
Kontrollen für errorlevel
sein mindestens 1 , die an diesem Punkt arbeiten sollten:
Error-Nummer Gibt einen wahren Zustand, wenn der letzten Programmlauf einen Exit-Code gleich oder größer als die angegebene Nummer zurück. -
help if
Im allgemeinen Überprüfung errorlevel
mit if %errorlevel%==
ist eine ganz schlechte Idee, es sei denn, Sie haben die Semantik für Exit-Codes auf 0 zu vergleichen sind, dass anything
Nicht-Null-Signale Ausfall. Ihre Annahme, hier war nur, dass taskkill
1
bei einem Fehler zurückkehren würde.
Am kann ich bitten, warum diese in einer Endlosschleife tun? taskkill
bereits tötet alle Instanzen itunes.exe
. Und du bist in einer engen Schleife ohne Verzögerungen ausgeführt, so dass Ihre Batch-Dateien wahrscheinlich einen Core-CPU verbraucht, während es läuft.
ETA: Übersehene Ihre edit: Warum in aller Welt geschweiften Klammern? Blöcke in Batch-Dateien sind delimieted durch runde Klammern.
Andere Tipps
eine alternative Lösung, in vbscript, speichert unter Code als 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
auf der Kommandozeile
c:\test> cscript //nologo mykill.vbs "itunes.exe"
Warum Sie nicht Powershell verwenden?
try
{
Stop-Process -Name itunes -ErrorAction Stop
"iTunes is killed"
}
catch
{
"iTunes not found"
}