Board logo

标题: [问题求助] 这种监视PID与否并作出相应动作vbs可以做到吗-附上同功能BAT [打印本页]

作者: F_Ms    时间: 2015-3-20 18:34     标题: 这种监视PID与否并作出相应动作vbs可以做到吗-附上同功能BAT

本人知道使用bat除了写入自己的pid好像有点难,其它没什么问题,对vbs了解不多,不知vbs可以做到吗
bat代码:
  1. @echo off
  2. ::设置再次检测等待时间
  3. set xtime=10
  4. ::PID写出不会,没有想到绝妙的法子,试想过用先后tasklist对比分析,但觉得不科学准确性也不高... ...
  5. :recheck
  6. ::从pid.txt提取所要检查的pid
  7. if not exist pid.txt start a.exe&goto recheck
  8. for /f %%a in (pid.txt) do set pid=%%a
  9. :recheck2
  10. ::查看pid是否存在并作出判断后动作
  11. (for /f "skip=2 tokens=2 delims=," %%b in ('tasklist /fo csv /nh') do @echo=%%~b)|findstr /i "\<%pid%\>">nul
  12. 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,之前用的是从网络上搜索的这个
  1. set wsShell=createobject("wscript.shell")
  2. do
  3.     if not isProcessExists("cmd.exe") then
  4.         wsShell.run """a.exe""",1
  5.     end if
  6.     WScript.Sleep 1000*10
  7. loop
  8. Private Function isProcessExists(proName)
  9.     Set objWMIService = GetObject("winmgmts:" & "{impersonationlevel=impersonate}!\\.\root\cimv2")
  10.     Set colProcessList = objWMIService.ExecQuery("Select * from Win32_Process Where Name='" & proName & "'")
  11.     isProcessExists = (colProcessList.Count <> 0)
  12. End Function
复制代码
但是目前需要更高一层的vbs,但苦于网络上基本搜索不到,本人对vbs几乎一窍不通,又因为只是个基本固定的功能不想深入研究也还没打算学习,所以--- ---
(项目为为学校义务机房相关管制bat,非不良用途)
作者: CrLf    时间: 2015-3-20 21:27

获取当前 cmd 进程的 pid 可以这样:
  1. @echo off
  2. for /f %%a in ('ppids') do set 我的pid=%%a
  3. set 我的pid
  4. pause
复制代码
需要第三方工具 ppids,下载地址:http://www.bathome.net/viewthread.php?tid=23031
作者: yu2n    时间: 2015-3-20 23:46

获取当前CMD 的 PID  By Yu2n
注意,当一个BAT文件被同时多次开启时,可能撞车……
  1. @echo off
  2. :: @set "DebugOff= ' "
  3. @call :_CmdPid "%~0"
  4. :: ↑ 此行不能写在标签内,建议写在脚本开头
  5. echo CMD PID: %CmdPid%
  6. pause
  7. goto :eof
  8. :_CmdPid
  9.   (echo For Each objItem In GetObject^("winmgmts:\\.\root\cimv2:win32_process"^).Instances_
  10.   echo   If LCase^(objItem.Name^)=LCase^("cmd.exe"^) And InStr^(1,objItem.CommandLine,"%~1",vbTextCompare^)^>0 Then _
  11.   echo       CurPID=objItem.ProcessID %DebugOff%: WScript.Echo CurPID,objItem.Name,objItem.CommandLine
  12.   echo Next
  13.   echo WScript.Quit^(CurPID^))>"%tmp%\CmdPid.vbs"
  14.   CScript //NoLogo "%tmp%\CmdPid.vbs"
  15.   set CmdPid=%ErrorLevel%
  16.   del /q "%tmp%\CmdPid.vbs"
  17.   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

  1. @echo off
  2. ::设置再次检测等待时间
  3. set xtime=10
  4. for /f "tokens=2" %%a in ('tasklist /v ^| findstr /c:"- %0"') do (
  5.     set "pid=%%a"
  6. )
  7. echo,%pid%
  8. :recheck2
  9. ::查看pid是否存在并作出判断后动作
  10. (for /f "skip=2 tokens=2 delims=," %%b in ('tasklist /fo csv /nh') do @echo=%%~b)|findstr /i "\<%pid%\>">nul
  11. if "%errorlevel%"=="0" (ping -n %xtime% 127.1>nul&goto recheck2) else start a.exe&goto recheck
复制代码

作者: DAIC    时间: 2015-3-21 16:07

  1. @echo off
  2. ::设置再次检测等待时间
  3. set xtime=10
  4. set "myTitle=%date% %time%"
  5. title %myTitle%
  6. for /f "tokens=2" %%i in ('tasklist /v ^| findstr /c:"%myTitle%"') do (
  7.     set "pid=%%i"
  8. )
  9. echo,%pid%
  10. :recheck2
  11. ::查看pid是否存在并作出判断后动作
  12. (for /f "skip=2 tokens=2 delims=," %%b in ('tasklist /fo csv /nh') do @echo=%%~b)|findstr /i "\<%pid%\>">nul
  13. 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://bbs.bathome.net/) Powered by Discuz! 7.2