2009-12-13 3 views
5

Ich habe die folgende Batch-Datei, die das iTunes-Programm beendet so, dass, wenn ich meinen iPod verbinden, wird es nicht synchronisieren. (Ich weiß, dass Sie dies in iTunes einrichten können.)Töten eines Prozesses in Batch und Berichterstattung über Erfolg

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

jedoch die >nul nicht auf den Befehl reagiert; Es gibt nur den Standardbefehlstext. Also ja, was ich tun möchte:

Wenn iTunes nicht gefunden wird, wie durch den Befehl gegeben, sollte es

iTunes angezeigt werden nicht

gefunden

Wenn es gefunden wird, und beendet,

iTunes

getötet

Hilfe? die errorlevel funktionieren nicht, das scheint der Fehler der nul nicht zu funktionieren.

Antwort

11

Works für mich 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 taskkillist einen richtigen Exit-Code zurück. Die Umleitung seiner Ausgabe hat damit nichts zu tun. Aber die Fehlerstufe für Fehler ist 128. Sie sollten wirklich das richtige Idiom für die Überprüfung auf Fehler verwenden.

Es scheint auch, dass taskkill druckt stderr so sehen Sie seine Ausgabe immer noch, wenn nur Umleitung stdout. Sie können prüfen, über Code zu umschreiben:

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

Die 2>&1 leitet die Standard-Fehlerausgabe in das große Nichts. if errorlevel 1 prüft errorlevelmindestens 1 ist, die an diesem Punkt arbeiten soll:

Error-Nummer Gibt einen wahren Zustand, wenn das letzte Programm Lauf angegeben einen Exit-Code zurückgegeben gleich oder größer als die Zahl. - help if

Überprüfung Allgemeinen errorlevel mit if %errorlevel%== ist eine ganz schlechte Idee, es sei denn, Sie vergleichen auf 0. Die Semantik für Exit-Codes sind, dass anything Nicht-Null-Signale Ausfall. Ihre Annahme hier war einfach, dass taskkill1 bei Ausfall zurückgeben würde.

Antwort kann ich bitte fragen, warum Sie das in einer Endlosschleife tun? taskkill tötet bereits alle Instanzen von itunes.exe. Und Sie laufen in einer engen Schleife ohne Verzögerungen, so dass Ihre Batch-Dateien wahrscheinlich einen CPU-Kern verbrauchen, während dieser ausgeführt wird.

ETA: Übersehen Sie Ihre Bearbeitung: Warum in aller Welt geschweifte Klammern? Blöcke in Stapeldateien sind durch runde Klammern begrenzt.

+0

'Warum auf eart geschweiften Klammern', gut, ich benutze sie, solange ich mit ihnen arbeitete. Ich weiß es nicht; ich mag es einfach. Es sieht schöner aus, denke ich. –

+2

Nun, wenn Sie sie in Batch-Dateien verwenden, dann erwarten Sie, dass die Dinge falsch laufen. Wenn Sie Code in einer Sprache schreiben, müssen Sie die Grammatik der Sprache verwenden, egal was schöner aussieht oder nicht. Curly-Klammern funktionieren nicht als Blocktrennzeichen im Stapel. – Joey

+0

Ich dachte, sie taten es. Zumindest haben sie für die Codes gearbeitet, die ich benutzt habe. Ich arbeite jetzt seit über einem Jahr mit Batch und habe mich immer wieder mit geschweiften Klammern entwickelt, und es funktioniert gut. Meine Kunden (aka youtubers;)) sagen, dass es für sie gut funktioniert. –

0

eine alternative Lösung, in vbscript, unter Code speichern als

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 Linie Befehl mykill.vbs

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

Warum Sie Powershell nicht verwenden?

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