Board logo

标题: [系统相关] [已解决]批处理如何实现检测多个进程是否存在? [打印本页]

作者: macangyekillua    时间: 2016-10-30 13:53     标题: [已解决]批处理如何实现检测多个进程是否存在?

请教下多个进程检测的问题,谢谢!
假设有A、B、C、D……多个进程,希望假如其中有一个进程没在,就提示“某某进程”不存在,全在就提示都在。
请恕菜鸟我愚钝,研究半天也没有缕清思路,特来求教,谢谢!
  1. @echo off
  2. set Pro1=a.exe
  3. set Pro2=b.exe
  4. set Pro3=c.exe
  5. set Pro4=d.exe
  6. set Num=0
  7. for /f "tokens=1 delims= " %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do (
  8.     set Pro=%%~a
  9.     set /a Num+=1
  10. )
  11. if %Num% lss 4 (goto 提示) else mshta vbscript:Msgbox("都在!",64,"注意!")(window.close)
  12. goto :eof
  13. :提示
  14. mshta vbscript:Msgbox("%Pro%不存在!",64,"注意!")(window.close)
  15. goto :eof
复制代码
有什么不对的,提醒就好了,知道自己算是伸手党,我又不是学这个的,已经尽量谦卑了。扣这扣那的,感觉不到一点人性,以后提问还是去百度知道好了。
作者: pcl_test    时间: 2016-10-30 14:08

先弄清楚Pro和Num干嘛用的,if %Pro% lss 4和goto :eof又是什么意思
作者: macangyekillua    时间: 2016-10-30 14:12

回复 2# pcl_test
呃,那个是打的时候打错了。
作者: pcl_test    时间: 2016-10-30 16:21

本帖最后由 pcl_test 于 2016-11-9 19:29 编辑
  1. @echo off
  2. for %%a in (a b c d) do (
  3.     set p=%%a
  4.     rem 每循环一次,p的值更替一次
  5.     call echo;%%p%%
  6. )
  7. rem 最后p的值为最末一次循环的结果,不能判断哪个不存在
  8. echo;----%p%
  9. pause
复制代码
  1. @echo off&setlocal enabledelayedexpansion
  2. ::举个栗子
  3. rem 方法一
  4. for %%a in (a b c d) do cmd /u /c echo;a c|find "%%a">nul||set "p=!p! %%a"
  5. echo;缺%p%
  6. pause
  7. set p=
  8. rem 方法二
  9. for /f %%a in ('cmd /u /c echo;a b d^|more') do set "#%%a=1"
  10. for %%a in (a b c d) do if not defined #%%a (set "p=!p! %%a")
  11. echo;缺%p%
  12. pause
复制代码
================
  1. rem win7及以上系统运行
  2. powershell -c "$list='a','b','c','d';$a=@{};$list|%%{$a[$_]=0};gps $list -ErrorAction SilentlyContinue|%%{$a[$_.Name]+=1};$c=@();foreach($b in $a.Keys){if($a[$b] -eq 0){$c+=(,$b)}};$a;if($c){\"`r`n不存在:\"+($c -join '; ')"}
  3. pause
复制代码

作者: macangyekillua    时间: 2016-10-30 18:30

pcl_test 发表于 2016-10-30 16:21


谢谢指教!我改成了这样,如何才能四个都在的时候不提示啊?
  1. @echo off&setlocal enabledelayedexpansion
  2. set Pro1=a.exe
  3. set Pro2=b.exe
  4. set Pro3=c.exe
  5. set Pro4=d.exe
  6. for /f %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do set "#%%a=1"
  7. for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
  8. mshta vbscript:Msgbox("%p%不存在!",64,"注意!")(window.close)
  9. pause
复制代码

作者: GNU    时间: 2016-10-31 10:15

本帖最后由 GNU 于 2016-10-31 16:28 编辑
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set Pro1=a.exe
  4. set Pro2=b.exe
  5. set Pro3=c.exe
  6. set Pro4=d.exe
  7. set n=0
  8. for /f %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do (
  9.     set "#%%a=1"
  10.     set /a n+=1
  11. )
  12. if !n! equ 4 (
  13.     goto :end
  14. )
  15. for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
  16. mshta vbscript:Msgbox("%p%不存在!",64,"注意!")(window.close)
  17. :end
  18. pause
复制代码

作者: macangyekillua    时间: 2016-10-31 16:01

本帖最后由 macangyekillua 于 2016-10-31 16:09 编辑

回复 6# GNU

谢谢指教,在你的代码基础上,我把:
set n+=1 改成 set /a n+=1
equ 4     改成  equ 6
就可以了,虽然不知道为什么,但是还是很感谢你。
作者: GNU    时间: 2016-10-31 16:29

回复 7# macangyekillua


是的,6楼代码笔误。
set 是赋值
set /a 是计算
作者: macangyekillua    时间: 2016-11-1 18:50

回复 8# GNU
你知道为什么是6而不是4么?
作者: aa77dd@163.com    时间: 2016-11-1 20:29

本帖最后由 aa77dd@163.com 于 2016-11-8 21:08 编辑

回复 9# macangyekillua

直接看这个的显示, 应试有 1 或 多个 exe 不止一个进程
  1. tasklist | findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"
复制代码
4 个 exe 都有进程的充要条件
  1. "!#%Pro1%!!#%Pro2%!!#%Pro3%!!#%Pro4%!"=="1111"
  2. rem 上面原有一个编辑错误, 已更正
复制代码
无论 !n! equ 4 还是 !n! equ 6 都是不正确的判断 4 个 EXE 都有进程的方式, 比如某个 exe 有 6 个进程, 而另 3 个 EXE 都没有进程,  !n! equ 6 会返回真值, 但判断错误; 同理,  !n! equ 4  在进程总和是 4 时就会返回真值, 但总和 = 4 并不等于每个 EXE 都有进程.
作者: macangyekillua    时间: 2016-11-8 20:46

回复 10# aa77dd@163.com


为了调试,我加了点代码,还是很奇怪:
当进程a在的时候,结果是等于“1”,当ab都在的时候结果还是“1”,当abc都在的时候结果是“11”,当abcd都在的时候结果是“111“,没有结果”1111“,这是为什么呢?
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set Pro1=a.exe
  4. set Pro2=b.exe
  5. set Pro3=c.exe
  6. set Pro4=d.exe
  7. for /f %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do (
  8. )
  9. if "!#%Pro1%!!%#Pro2%!!#%Pro3%!!#%Pro4%!"=="111" (
  10.     goto :end
  11. )
  12. for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
  13. mshta vbscript:Msgbox("%p%不存在!",64,"注意!")(window.close)
  14. :end
  15. tasklist | findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"
  16. echo "!#%Pro1%!!%#Pro2%!!#%Pro3%!!#%Pro4%!"
  17. pause
复制代码

作者: aa77dd@163.com    时间: 2016-11-8 21:00

本帖最后由 aa77dd@163.com 于 2016-11-8 21:05 编辑

回复 11# macangyekillua

你代码中有低级的编辑错误, 但这个低级错误是我先打出来的, 你没仔细看, 连同我的错误一起 copy 了
  1. "!#%Pro1%!!%#Pro2%!!#%Pro3%!!#%Pro4%!"=="1111"
复制代码
正确应为
  1. "!#%Pro1%!!#%Pro2%!!#%Pro3%!!#%Pro4%!"=="1111"
复制代码

作者: macangyekillua    时间: 2016-11-8 21:27

本帖最后由 macangyekillua 于 2016-11-8 21:30 编辑

回复 12# aa77dd@163.com


哈哈还真是,我看了几遍都没看出来。

有什么好办法可以简单的辨别出重复进程么?
作者: aa77dd@163.com    时间: 2016-11-8 21:56

回复 13# macangyekillua

计数
  1. set /a "#%%a+=1"
复制代码

作者: macangyekillua    时间: 2016-11-20 10:18

回复 14# aa77dd@163.com

不好意思,前段时间有事,一直没来得及研究,还有个问题想请教一下。
当代码为:
  1. "!#%Pro1%!!#%Pro2%!!#%Pro3%!!#%Pro4%!"=="2211"
复制代码
假设要有两个a.exe和两个b.exe,而现在系统中abcd都只有一个。

代码:
  1. for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
复制代码
上面这个代码得不到少了一个a.exe和b.exe的结果,结果是空的。请问要怎么办呢?谢谢指教!




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