标题: [问题求助] 这种监视PID与否并作出相应动作vbs可以做到吗-附上同功能BAT [打印本页]
作者: F_Ms 时间: 2015-3-20 18:34 标题: 这种监视PID与否并作出相应动作vbs可以做到吗-附上同功能BAT
本人知道使用bat除了写入自己的pid好像有点难,其它没什么问题,对vbs了解不多,不知vbs可以做到吗
bat代码:- @echo off
- ::设置再次检测等待时间
- set xtime=10
- ::PID写出不会,没有想到绝妙的法子,试想过用先后tasklist对比分析,但觉得不科学准确性也不高... ...
- :recheck
- ::从pid.txt提取所要检查的pid
- if not exist pid.txt start a.exe&goto recheck
- for /f %%a in (pid.txt) do set pid=%%a
- :recheck2
- ::查看pid是否存在并作出判断后动作
- (for /f "skip=2 tokens=2 delims=," %%b in ('tasklist /fo csv /nh') do @echo=%%~b)|findstr /i "\<%pid%\>">nul
- if "%errorlevel%"=="0" (ping -n %xtime% 127.1>nul&goto recheck2) else start a.exe&goto recheck
复制代码
希望vbs大神能够解答
作者: batman 时间: 2015-3-20 19:02
WMI事件监控
作者: F_Ms 时间: 2015-3-20 20:25
回复 2# batman
,超版回复的
是这样的,本人一直在学习bat,但是目前做的一个项目中需要复活功能,当然不能还用bat来制作了,毕竟bat的运行都会开启cmd进程,有可能会被一并杀死,就想到了vbs,之前用的是从网络上搜索的这个- set wsShell=createobject("wscript.shell")
-
- do
- if not isProcessExists("cmd.exe") then
- wsShell.run """a.exe""",1
- end if
- WScript.Sleep 1000*10
- loop
-
-
- Private Function isProcessExists(proName)
- Set objWMIService = GetObject("winmgmts:" & "{impersonationlevel=impersonate}!\\.\root\cimv2")
- Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name='" & proName & "'")
- isProcessExists = (colProcessList.Count <> 0)
- End Function
复制代码
但是目前需要更高一层的vbs,但苦于网络上基本搜索不到,本人对vbs几乎一窍不通,又因为只是个基本固定的功能不想深入研究也还没打算学习,所以--- ---
(项目为为学校义务机房相关管制bat,非不良用途)
作者: CrLf 时间: 2015-3-20 21:27
获取当前 cmd 进程的 pid 可以这样:- @echo off
- for /f %%a in ('ppids') do set 我的pid=%%a
- set 我的pid
- pause
复制代码
需要第三方工具 ppids,下载地址:http://www.bathome.net/viewthread.php?tid=23031
作者: yu2n 时间: 2015-3-20 23:46
获取当前CMD 的 PID By Yu2n
注意,当一个BAT文件被同时多次开启时,可能撞车……- @echo off
- :: @set "DebugOff= ' "
- @call :_CmdPid "%~0"
- :: ↑ 此行不能写在标签内,建议写在脚本开头
- echo CMD PID: %CmdPid%
- pause
-
- goto :eof
- :_CmdPid
- (echo For Each objItem In GetObject^("winmgmts:\\.\root\cimv2:win32_process"^).Instances_
- echo If LCase^(objItem.Name^)=LCase^("cmd.exe"^) And InStr^(1,objItem.CommandLine,"%~1",vbTextCompare^)^>0 Then _
- echo CurPID=objItem.ProcessID %DebugOff%: WScript.Echo CurPID,objItem.Name,objItem.CommandLine
- echo Next
- echo WScript.Quit^(CurPID^))>"%tmp%\CmdPid.vbs"
- CScript //NoLogo "%tmp%\CmdPid.vbs"
- set CmdPid=%ErrorLevel%
- del /q "%tmp%\CmdPid.vbs"
- goto :eof
复制代码
作者: F_Ms 时间: 2015-3-21 10:00
获取当前CMD 的 PID By Yu2n
注意,当一个BAT文件被同时多次开启时,可能撞车……
yu2n 发表于 2015-3-20 23:46
我的初衷是想要一个实现流程图所述功能的vbs... ...,好吧继续等大神,这个bat pid获取看起来挺厉害的,不过其中好像包含了vbs代码,不太理解,望大神能够给个可以实现流程图所述功能的vbs
作者: yu2n 时间: 2015-3-21 10:06
回复 6# F_Ms
流程图能具体点么?
作者: F_Ms 时间: 2015-3-21 11:13
回复 7# yu2n
就跟附上的同功能bat实现的功能相同就好(需要将自身的pid写出到文件,这个同功能bat没能实现)
作者: yu2n 时间: 2015-3-21 15:36
回复 8# F_Ms
pid.txt 是什么?如果是PID的话,PID不是由系统随机分配的么?
作者: DAIC 时间: 2015-3-21 15:59
- @echo off
- ::设置再次检测等待时间
- set xtime=10
-
- for /f "tokens=2" %%a in ('tasklist /v ^| findstr /c:"- %0"') do (
- set "pid=%%a"
- )
- echo,%pid%
-
- :recheck2
- ::查看pid是否存在并作出判断后动作
- (for /f "skip=2 tokens=2 delims=," %%b in ('tasklist /fo csv /nh') do @echo=%%~b)|findstr /i "\<%pid%\>">nul
- if "%errorlevel%"=="0" (ping -n %xtime% 127.1>nul&goto recheck2) else start a.exe&goto recheck
复制代码
作者: DAIC 时间: 2015-3-21 16:07
- @echo off
- ::设置再次检测等待时间
- set xtime=10
-
- set "myTitle=%date% %time%"
- title %myTitle%
- for /f "tokens=2" %%i in ('tasklist /v ^| findstr /c:"%myTitle%"') do (
- set "pid=%%i"
- )
- echo,%pid%
-
- :recheck2
- ::查看pid是否存在并作出判断后动作
- (for /f "skip=2 tokens=2 delims=," %%b in ('tasklist /fo csv /nh') do @echo=%%~b)|findstr /i "\<%pid%\>">nul
- if "%errorlevel%"=="0" (ping -n %xtime% 127.1>nul&goto recheck2) else start a.exe&goto recheck
复制代码
作者: F_Ms 时间: 2015-3-21 18:25
回复 9# yu2n
是这样,本人擅长bat但是对vbs一窍不通,项目功能实现全是靠bat,但是进程监视需要非bat代码,所以找vbs
项目bat运行后将自己的pid写入pid.txt,然后由vbs读取后查看进程状况,如果进程被杀则复活项目主程
作者: F_Ms 时间: 2015-3-21 18:28
回复 11# DAIC
解决了另一个问题,正好项目主程是的标题是随机的,这样的话可以增加定位pid准确性,进程名称+进程标题定位pid,恩,谢咯
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |