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.

¿Fue útil?

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"
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top