2011-07-01 14 views
5

Me gustaría usar un archivo por lotes para comparar el número de procesos llamados "standard.exe", que se ejecutan en mi máquina con Windows 7, con número de procesos llamados "basic.exe". Si la cantidad de procesos llamados "standard.exe" es igual a la cantidad de procesos llamados "basic.exe" no debería pasar nada, si los números son desiguales, basic.exe debería reiniciarse.Cómo contar la cantidad de procesos con nombre idéntico actualmente en ejecución, utilizando un archivo por lotes

¿Alguna idea? Ya encontré el siguiente código para verificar si un proceso se está ejecutando, pero ahora me gustaría contar la cantidad de procesos que llevan el mismo nombre.

tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /N "myapp.exe">NUL 
if "%ERRORLEVEL%"=="0" echo Programm is running 

¡Gracias de antemano!

+0

¿Es posible que haya menos procesos "standard.exe" que "basic.exe"? Si es así, ¿qué debería hacerse en ese caso? –

+0

standard.exe solo puede ser menor o igual a basic.exe (ejecutar basic.exe crea un proceso llamado standard.exe). Por lo tanto, de hecho es muy posible que haya menos procesos "standard.exe" que "basic.exe", en cuyo caso todos los procesos basic.exe deben cerrarse y reiniciarse. –

Respuesta

4

Usando su ejemplo simplemente reemplace el/N en find con/C para devolver el recuento de procesos.

tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /C "myapp.exe" 

A continuación, puede simplemente reducirlo a:

tasklist | find /I /C "myapp.exe" 

Aunque como señala Andriy M que coincidirá tanto myapp.exe y notmyapp.exe.

En cuanto a la segunda parte de su pregunta, simplemente hacer esto:

set a=tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /C "myapp.exe" 
set b=tasklist /FI "IMAGENAME eq myapp2.exe" 2>NUL | find /I /C "myapp2.exe" 
if not a==b do ( 
    stuff 
) 
+0

En general, creo que la segunda parte del código no es igual a la primera, porque contaría "myapp.exe" junto con "notmyapp.exe". –

+0

Gracias Maynza, parece funcionar de hecho. Sin embargo, todavía no estoy seguro de cómo hacer la comparación entre ambos procesos. ¿Algún consejo? Gracias –

+0

Bueno, podría almacenar uno o ambos valores en una variable de entorno y luego compararlos. es decir: establecer a = lista de tareas/FI "IMAGENAME eq myapp.exe" 2> NUL | find/I/C "myapp.exe" set b = tasklist/FI "IMAGENAME eq myapp2.exe" 2> NUL | encuentre/I/C "myapp2.exe" si a == b do (cosas) – Maynza

2

Existe probablemente una manera más ordenado a hacerlo, pero el siguiente código parece hacer el truco:

:begin 
tasklist | find /I /C "standard.exe">D:\tmpfile1.txt 
tasklist | find /I /C "basic.exe">D:\tmpfile2.txt 
set /p var1= <D:\tmpfile1.txt 
set /p var2= <D:\tmpfile2.txt 
if %var1% LSS %var2% goto restart 
if %var1% EQU %var2% goto wait 

:wait 
echo waiting.. 
ping -n 300 127.0.0.1 > nul 
goto begin 

:restart 
echo error has occured, all processes will be restarted 
taskkill /f /im standard.exe 
taskkill /f /im basic.exe 
ping -n 30 127.0.0.1 > nul 

goto begin 

¡Salud!

5

Si no desea escribir un archivo, reemplace el tasklist y establecer var1 comandos con

for /f "tokens=1,*" %%a in ('tasklist ^| find /I /C "standard.exe"') do set var1=%%a 

mismo para los segundos.

for /f "tokens=1,*" %%a in ('tasklist ^| find /I /C "basic.exe"') do set var2=%%a 
+0

No soy un experto en archivos por lotes. La solución de @Maynza funciona siempre que intente establecer una variable para la salida. entonces la línea da el valor de retorno correcto pegado directamente al cmd ... pero en el conjunto de lotes x = ... da 0 ... Sin embargo, usando Win10 x64, ¡esta solución funcionó para mí! – dba

Cuestiones relacionadas