标题: [系统相关] [已解决]批处理如何实现检测多个进程是否存在? [打印本页]
作者: macangyekillua 时间: 2016-10-30 13:53 标题: [已解决]批处理如何实现检测多个进程是否存在?
请教下多个进程检测的问题,谢谢!
假设有A、B、C、D……多个进程,希望假如其中有一个进程没在,就提示“某某进程”不存在,全在就提示都在。
请恕菜鸟我愚钝,研究半天也没有缕清思路,特来求教,谢谢!- @echo off
- set Pro1=a.exe
- set Pro2=b.exe
- set Pro3=c.exe
- set Pro4=d.exe
-
- set Num=0
- for /f "tokens=1 delims= " %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do (
- set Pro=%%~a
- set /a Num+=1
- )
- if %Num% lss 4 (goto 提示) else mshta vbscript:Msgbox("都在!",64,"注意!")(window.close)
- goto :eof
-
- :提示
- mshta vbscript:Msgbox("%Pro%不存在!",64,"注意!")(window.close)
- 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 编辑
- @echo off
- for %%a in (a b c d) do (
- set p=%%a
- rem 每循环一次,p的值更替一次
- call echo;%%p%%
- )
- rem 最后p的值为最末一次循环的结果,不能判断哪个不存在
- echo;----%p%
- pause
复制代码
- @echo off&setlocal enabledelayedexpansion
- ::举个栗子
- rem 方法一
- for %%a in (a b c d) do cmd /u /c echo;a c|find "%%a">nul||set "p=!p! %%a"
- echo;缺%p%
- pause
- set p=
- rem 方法二
- for /f %%a in ('cmd /u /c echo;a b d^|more') do set "#%%a=1"
- for %%a in (a b c d) do if not defined #%%a (set "p=!p! %%a")
- echo;缺%p%
- pause
复制代码
================- rem win7及以上系统运行
- 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 '; ')"}
- pause
复制代码
作者: macangyekillua 时间: 2016-10-30 18:30
pcl_test 发表于 2016-10-30 16:21
谢谢指教!我改成了这样,如何才能四个都在的时候不提示啊?- @echo off&setlocal enabledelayedexpansion
- set Pro1=a.exe
- set Pro2=b.exe
- set Pro3=c.exe
- set Pro4=d.exe
-
- for /f %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do set "#%%a=1"
- for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
- mshta vbscript:Msgbox("%p%不存在!",64,"注意!")(window.close)
- pause
复制代码
作者: GNU 时间: 2016-10-31 10:15
本帖最后由 GNU 于 2016-10-31 16:28 编辑
- @echo off
- setlocal enabledelayedexpansion
- set Pro1=a.exe
- set Pro2=b.exe
- set Pro3=c.exe
- set Pro4=d.exe
- set n=0
-
- for /f %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do (
- set "#%%a=1"
- set /a n+=1
- )
- if !n! equ 4 (
- goto :end
- )
-
- for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
- mshta vbscript:Msgbox("%p%不存在!",64,"注意!")(window.close)
-
- :end
- 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 不止一个进程- tasklist | findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"
复制代码
4 个 exe 都有进程的充要条件- "!#%Pro1%!!#%Pro2%!!#%Pro3%!!#%Pro4%!"=="1111"
-
- 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“,这是为什么呢?- @echo off
- setlocal enabledelayedexpansion
- set Pro1=a.exe
- set Pro2=b.exe
- set Pro3=c.exe
- set Pro4=d.exe
-
- for /f %%a in ('tasklist ^| findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"') do (
- )
- if "!#%Pro1%!!%#Pro2%!!#%Pro3%!!#%Pro4%!"=="111" (
- goto :end
- )
-
- for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
- mshta vbscript:Msgbox("%p%不存在!",64,"注意!")(window.close)
-
- :end
- tasklist | findstr /i "%Pro1% %Pro2% %Pro3% %Pro4%"
- echo "!#%Pro1%!!%#Pro2%!!#%Pro3%!!#%Pro4%!"
- pause
复制代码
作者: aa77dd@163.com 时间: 2016-11-8 21:00
本帖最后由 aa77dd@163.com 于 2016-11-8 21:05 编辑
回复 11# macangyekillua
你代码中有低级的编辑错误, 但这个低级错误是我先打出来的, 你没仔细看, 连同我的错误一起 copy 了- "!#%Pro1%!!%#Pro2%!!#%Pro3%!!#%Pro4%!"=="1111"
复制代码
正确应为- "!#%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
计数复制代码
作者: macangyekillua 时间: 2016-11-20 10:18
回复 14# aa77dd@163.com
不好意思,前段时间有事,一直没来得及研究,还有个问题想请教一下。
当代码为:- "!#%Pro1%!!#%Pro2%!!#%Pro3%!!#%Pro4%!"=="2211"
复制代码
假设要有两个a.exe和两个b.exe,而现在系统中abcd都只有一个。
代码:- for %%a in (%Pro1% %Pro2% %Pro3% %Pro4%) do if not defined #%%a (set "p=!p! %%a")
复制代码
上面这个代码得不到少了一个a.exe和b.exe的结果,结果是空的。请问要怎么办呢?谢谢指教!
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |