Board logo

标题: [系统相关] [已解决]如何用极简BAT代码判断进程数? [打印本页]

作者: pZjVa0    时间: 2013-7-26 00:43     标题: [已解决]如何用极简BAT代码判断进程数?

本帖最后由 pZjVa0 于 2013-7-27 12:27 编辑

给大家出个小题,我找了一下网上判断进程数量的代码不多,本人入门菜鸟懂得不多,想问各位大大如果要判断进程数量,用最少的代码应该如何实现?

例子:
判断QQ数目
当QQ.exe数量大于2时,打开calc.exe计算器

作者: batman    时间: 2013-7-26 01:07

  1. @echo off
  2. set /a n=0
  3. for /f "delims=" %%a in ('tasklist^|findstr /i "qq.exe"') do set /a n+=1
  4. if %n% gtr 2 calc.exe
复制代码

作者: pZjVa0    时间: 2013-7-26 01:31

回复 2# batman


    谢谢batman版主,传说中的n值又开始进行计算了
作者: pZjVa0    时间: 2013-7-26 01:56

回复 2# batman


    这个代码是不是少了一个循环?如果单纯这样的话不是只会+1就跑了吗?
作者: pZjVa0    时间: 2013-7-26 01:58

回复 2# batman


    忘了...for本身有循环
作者: pZjVa0    时间: 2013-7-26 02:18

回复 2# batman


    这个代码没有对进程名完成匹配,如果出现hkcmd.exe也会被计算进去
作者: CrLf    时间: 2013-7-26 02:55

本帖最后由 CrLf 于 2013-7-26 03:01 编辑

回复 2# batman


可以用 find /c 简化成:
  1. @echo off
  2. for /f "delims=" %%a in ('tasklist /fo csv^|find /i /c ""qq.exe""') do if %%a gtr 2 calc.exe
复制代码
或者这样:
  1. @echo off
  2. for /f "skip=2" %%a in ('tasklist /nh /fi "imagename eq qq.exe"') do calc.exe&goto next
  3. :next
复制代码
要极简就类似这样:
  1. @echo off
  2. tasklist /fi "imagename eq qq.exe"|more +3|findstr .&&calc.exe
复制代码

作者: batman    时间: 2013-7-26 08:13

回复 6# pZjVa0


    麻烦兄弟先测试再发表结论。。。
作者: pZjVa0    时间: 2013-7-26 08:35

本帖最后由 pZjVa0 于 2013-7-26 08:54 编辑

回复 7# CrLf

代码1
  1. 找不到文件 - QQ.EXE
  2. 请按任意键继续. . .
复制代码
应该修改成(去掉一层双引号)
  1. @echo off
  2.     for /f "delims=" %%a in ('tasklist /fo csv^|find /i /c "cmd.exe"') do if %%a gtr 2 calc.exe
  3. pause
复制代码
但是进程数判断还是不正确,例如我要判断cmd.exe的数量,就算我只打开两个窗口,进程数还是会显示4
  1. @echo off
  2.    for /f "delims=" %%a in ('tasklist /fo csv^|find /i /c "cmd.exe"') do echo %a%
  3. pause
复制代码
如何可以解决这个问题

::::::::::::::::我是万恶的分割线::::::::::::::::

请您能不能解释一下 代码3

我很感兴趣,但是不明白原理,从第三行开始显示,然后查找"."吗?那如何进行数量判断?
作者: lxzzr    时间: 2013-7-26 11:53

批处理自身会产生进程
作者: pZjVa0    时间: 2013-7-26 11:59

回复 10# lxzzr


    如果关闭所有cmd.exe进程情况下,单纯运行一个P,检测到3个,XP下会有两个。

一个cmd.exe算一个P,那其余多出来的是肿么回事呢?
作者: CrLf    时间: 2013-7-26 17:22

回复 11# pZjVa0


    有一个 cmd 是 for /f 产生的,刚给人解释过:
http://bbs.bathome.net/redirect. ... 6&fromuid=30406
作者: pZjVa0    时间: 2013-7-26 17:57

回复 12# CrLf


    好的。我大概懂判断了
作者: pZjVa0    时间: 2013-7-26 20:40

回复 12# CrLf


    虽然问题基本解决..但是无法精确判断导致在不同环境下出现兼容性问题,WIN7下检测到3个,xp下有2个
作者: pZjVa0    时间: 2013-7-27 12:07

兼容性问题大家有办法解决不?
作者: PowerShell    时间: 2013-7-27 22:41

本帖最后由 PowerShell 于 2013-7-29 19:20 编辑

我也想试试:
  1. if  ((Get-Process qq).count -gt 2) { calc.exe }
复制代码
powershell处理这个问题不需要用for,就算是用,也不需要新建powershell进程。

当然,如果判断powershell。exe,需要加一个,
至于[WIN7下检测到3个,xp下有2个],powershell应该不会有吧?谁测测?
作者: pZjVa0    时间: 2013-7-27 22:49

回复 16# PowerShell


    我在xp和win7下测试过了,
  1. if  ((Get-Process qq).count -gt 2) { clac.exe }
复制代码
您贴的这段代码我不太明白
作者: PowerShell    时间: 2013-7-28 13:10

本帖最后由 PowerShell 于 2013-7-29 19:19 编辑

不好意思,昨天头昏昏的,忘说这是powershell代码了。

if  ( (Get-Process qq).count -gt 2 )
{
  calc.exe
}

Get-Process 是获取系统进程的命令,和tasklist差不多,具体看手册,
Get-Process qq  是显示进程名是qq的,信息。这个信息,是由多个属性组成的。例如你想看qq的pid,就用 (Get-Process qq).id    。当然,前提要有qq这个进程才行。(Get-Process qq).count 自然就是qq的进程数了。


xp和win7 ,用上述命令 测试结果如何呢?
作者: Batcher    时间: 2013-7-28 13:25

回复 18# PowerShell


    应该是calc.exe吧
作者: PowerShell    时间: 2013-7-28 21:20

呵呵,写错了,多谢指正。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2