L'uccisione di un processo in Batch e la rendicontazione successo
-
19-09-2019 - |
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.
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"
}