如何使用批处理文件计算当前运行具有相同名称的进程数量

10
我想使用批处理文件来比较运行在我的Windows 7机器上的名为 "standard.exe" 的进程数和名为 "basic.exe" 的进程数。如果名为 "standard.exe" 的进程数等于名为 "basic.exe" 的进程数,则不会发生任何事情;如果它们不相等,则应重新启动 "basic.exe"。
有什么想法吗?已经找到以下代码来检查进程是否在运行,但现在我想计算同名进程的数量。
tasklist /FI "IMAGENAME eq myapp.exe" 2>NUL | find /I /N "myapp.exe">NUL
if "%ERRORLEVEL%"=="0" echo Programm is running

提前感谢!


是否有可能标准.exe进程比basic.exe进程少?如果是这样,应该怎么办? - Andriy M
standard.exe 只能小于或等于 basic.exe(运行 basic.exe 会创建一个名为 standard.exe 的进程)。因此,确实有可能 "standard.exe" 进程比 "basic.exe" 进程少,这种情况下需要关闭并重新启动所有的 basic.exe 进程。 - Sander_
3个回答

11

使用您的示例,只需将查找中的 /N 替换为 /C,即可返回进程计数。

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

那么您只需将其简化为:

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

虽然Andriy M指出它将同时匹配myapp.exe和notmyapp.exe。

至于你问题的第二部分,只需这样做:

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 
) 

一般来说,我认为第二段代码与第一段代码不相等,因为它会将"myapp.exe"和"notmyapp.exe"一起计算。 - Andriy M
谢谢Maynza,它确实有效。但是,我仍然不确定如何比较两个进程的数量?有什么提示吗?谢谢 - Sander_
你可以将其中一个或两个值存储在环境变量中,然后进行比较。例如: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" 如果 a==b 则执行 ( stuff )。 - Maynza

6

如果您不想编写文件,请使用tasklist替换并设置var1命令。

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

第二个与第一个类似。
for /f "tokens=1,*" %%a in ('tasklist ^| find /I /C "basic.exe"') do set var2=%%a

我不是批处理文件的专家。@Maynza的解决方案只要我尝试为输出设置一个变量就可以工作。因此,该行在直接粘贴到cmd时给出正确的返回值...但在批处理中,set x=...会给出0...然而,在使用Win10 x64时,这个解决方案对我有效! - dba

2

也许有更简洁的方法,但是以下代码似乎可以解决问题:

: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

干杯!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接