2009-12-13 10 views
5

Tengo el siguiente archivo de proceso por lotes, que termina el programa iTunes, de modo que si conecto mi iPod, no lo sincronizaré. (Sé que puede definir el sitio en iTunes.)Eliminando un proceso en Batch e informando sobre el éxito

@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 solo 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 se encuentran

Si se comprueba y se termina,

iTunes se mató

Ayuda? el errorlevel no funciona, esto parece ser culpa del nul que no funciona.

Respuesta

11

Obras 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 devolver un código de salida adecuada. La redirección de su salida no tiene nada que ver con esto. Pero el nivel de error para la falla es 128. Realmente debería usar la expresión apropiada para buscar errores.

También parece que taskkill está imprimiendo a stderr por lo que aún verá su salida, cuando acaba de redirigir stdout. Usted puede considerar volver a escribir el código de seguridad 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 la gran nada. if errorlevel 1 cheques para errorlevel ser al menos 1 que deben 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

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 anything distintos de cero. Su suposición aquí fue que taskkill devolvería 1 en caso de falla.

Ans, ¿puedo amablemente preguntar por qué estás haciendo esto en un ciclo sin fin? taskkill ya mata todas las instancias de itunes.exe. Y se está ejecutando en un bucle cerrado sin demoras, por lo que sus archivos de proceso por lotes probablemente consuman un núcleo de CPU mientras se está ejecutando.

ETA: Overlooked your edit: ¿Por qué las llaves? Los bloques en los archivos por lotes están delimitados por paréntesis redondos.

+0

'why on eart curly braces', bueno, los uso siempre que trabaje con ellos. No lo sé; simplemente me gusta. Se ve mejor, supongo. –

+2

Bueno, si los está usando en archivos por lotes, entonces espere que las cosas vayan mal. Si escribe código en un idioma, debe utilizar la gramática del idioma, independientemente de lo que se vea mejor o no. Las llaves no funcionan como delimitadores de bloque en lote. – Joey

+0

pensé que lo hicieron. Al menos trabajaron para los códigos que usé. Trabajo con lotes por más de 1 año, y me he desarrollado con llaves, una y otra vez, y funciona bien. Mis clientes (también conocidos como youtubers;) dicen que funciona bien para ellos. –

0

una solución alternativa, en VBScript, guardar a continuación 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" 
0

¿Por qué no utilizar PowerShell?

try 
{ 
    Stop-Process -Name itunes -ErrorAction Stop 
    "iTunes is killed" 
} 
catch 
{ 
    "iTunes not found" 
} 
Cuestiones relacionadas