Domanda

ho il seguente file batch, che consente di terminare il programma di iTunes in modo che se collego il mio iPod, non sta andando a eseguire la sincronizzazione.(So che si può impostare il backup in 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

Tuttavia, l' >nul non risponde al comando;dà semplicemente il comando predefinito di testo.Quindi sì, quello che voglio fare:

Se iTunes non è stato trovato, come è dato dal comando, si dovrebbe visualizzare

iTunes non trovato

Se viene trovato e risolto,

iTunes è ucciso

Aiuto?errorlevel non lavoro, questo sembra essere colpa del nul non funziona.

È stato utile?

Soluzione

Funziona, almeno per me:

> 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

Così taskkill è la restituzione di un apposito codice di uscita.Il redirect dell'output non ha nulla a che fare con questo.Ma il livello di errore per errore è di 128.Si dovrebbe davvero fare uso di un idioma per il controllo degli errori.

Sembra inoltre che taskkill stampa stderr così si vede la sua uscita ancora, quando solo il reindirizzamento stdout.Si potrebbe considerare la riscrittura di codice di cui sopra a:

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

Il 2>&1 reindirizza l'output di errore standard nel vasto nulla. if errorlevel 1 controlli per errorlevel essere almeno 1 che dovrebbe funzionare, a questo punto:

ERRORLEVEL numero Specifica una condizione vera se l'ultimo programma eseguito ha restituito un codice di uscita uguale o maggiore del numero specificato.—help if

Generalmente il controllo errorlevel con if %errorlevel%== è una cattiva idea, a meno che non si stanno confrontando a 0.La semantica per i codici di uscita sono che anything non-zero segnali di errore.Il presupposto era che taskkill vorresti tornare 1 in caso di fallimento.

Ans vorrei gentilmente chiedere perché si sta facendo questo in un loop infinito? taskkill già uccide tutti le istanze di itunes.exe.E si sta eseguendo in un loop stretto, senza ritardo, così il vostro file batch probabilmente consuma un core della CPU durante l'esecuzione.

ETA: Trascurato la tua modifica:Perché sulla terra parentesi graffe?Blocchi nel file batch sono delimieted da parentesi tonde.

Altri suggerimenti

una soluzione alternativa, in vbscript, salva sotto il codice come 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

sulla riga di comando

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

Perché non utilizzare PowerShell?

try
{
    Stop-Process -Name itunes -ErrorAction Stop
    "iTunes is killed"
}
catch
{
    "iTunes not found"
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top