返回列表 发帖

[问题求助] 这种监视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 recheckCOPY
希望vbs大神能够解答

WMI事件监控
***共同提高***

TOP

回复 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 COPY
但是目前需要更高一层的vbs,但苦于网络上基本搜索不到,本人对vbs几乎一窍不通,又因为只是个基本固定的功能不想深入研究也还没打算学习,所以--- ---
(项目为为学校义务机房相关管制bat,非不良用途)

TOP

获取当前 cmd 进程的 pid 可以这样:
@echo off
for /f %%a in ('ppids') do set 我的pid=%%a
set 我的pid
pauseCOPY
需要第三方工具 ppids,下载地址:http://www.bathome.net/viewthread.php?tid=23031

TOP

获取当前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 :eofCOPY
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

获取当前CMD 的 PID  By Yu2n
注意,当一个BAT文件被同时多次开启时,可能撞车……
yu2n 发表于 2015-3-20 23:46



    我的初衷是想要一个实现流程图所述功能的vbs... ...,好吧继续等大神,这个bat pid获取看起来挺厉害的,不过其中好像包含了vbs代码,不太理解,望大神能够给个可以实现流程图所述功能的vbs

TOP

回复 6# F_Ms

流程图能具体点么?
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 7# yu2n


    就跟附上的同功能bat实现的功能相同就好(需要将自身的pid写出到文件,这个同功能bat没能实现)

TOP

回复 8# F_Ms

pid.txt 是什么?如果是PID的话,PID不是由系统随机分配的么?
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

@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 recheckCOPY

TOP

@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 recheckCOPY

TOP

回复 9# yu2n


    是这样,本人擅长bat但是对vbs一窍不通,项目功能实现全是靠bat,但是进程监视需要非bat代码,所以找vbs
项目bat运行后将自己的pid写入pid.txt,然后由vbs读取后查看进程状况,如果进程被杀则复活项目主程

TOP

回复 11# DAIC


    解决了另一个问题,正好项目主程是的标题是随机的,这样的话可以增加定位pid准确性,进程名称+进程标题定位pid,恩,谢咯

TOP

返回列表