Matando a un proceso en lotes y la presentación de informes sobre el éxito
-
19-09-2019 - |
Pregunta
Tengo el siguiente archivo por lotes, que termina el programa iTunes es así, que si conecto mi iPod, que no va a sincronizar. (Sé que puede definir el sitio en 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
Sin embargo, el >nul
no responde al comando; por lo que sólo da el texto de comando predeterminado. Así que sí, lo que quiero hacer:
Si no se encuentra iTunes, según lo dado por el comando, debería mostrar
iTunes no encontrado
Si se comprueba y se termina,
iTunes se mató
Ayuda? el nivel de error de no funcionan, esto parece ser culpa del nul
no funciona.
Solución
funciona para mí, al menos:
> 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
Así taskkill
es que devuelve un código de salida adecuada. La redirección de su producción no tiene nada que ver con esto. Pero el nivel de error si falla es 128. Usted realmente debe utilizar el lenguaje adecuado para la comprobación de errores.
También parece que taskkill
esté imprimiendo en stderr
por lo que se ve su salida aún, cuando acaba de redirigir stdout
. Usted puede considerar volver a escribir el código anterior a:
taskkill /F /IM itunes.exe >nul 2>&1
if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.)
El 2>&1
redirige la salida de error estándar en el vasto nada. cheques if errorlevel 1
para errorlevel
ser al menos 1 que debe trabajar en este punto:
número ERRORLEVEL Especifica una condición verdadera si la última ejecución del programa devuelve un código de salida igual o mayor que el número especificado. -
help if
En general, comprobando errorlevel
con if %errorlevel%==
es una muy mala idea, a menos que usted está comparando a 0. La semántica para los códigos de salida son señales de que el fracaso no nulos anything
. Su hipótesis era que aquí sólo taskkill
volvería 1
en caso de fallo.
Ans puede amablemente preguntar por qué usted está haciendo esto en un bucle sin fin? taskkill
ya mata todos casos de itunes.exe
. Y se está ejecutando en un bucle estrecho sin retrasos por lo que sus archivos por lotes probablemente consume un núcleo de CPU mientras se está ejecutando.
ETA: se pasa por alto tu edición: ¿Por qué en la tierra llaves? Bloques en archivos por lotes se delimieted entre paréntesis el año.
Otros consejos
una solución alternativa, en VBScript, salvo por debajo de código como 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
en la línea de comandos
c:\test> cscript //nologo mykill.vbs "itunes.exe"
¿Por qué no utilizar PowerShell?
try
{
Stop-Process -Name itunes -ErrorAction Stop
"iTunes is killed"
}
catch
{
"iTunes not found"
}