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.

War es hilfreich?

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"
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top