返回列表 发帖

[问题求助] [已解决]VBS怎样检测进程的同时检测文件?

本帖最后由 luckboy45 于 2015-1-20 17:13 编辑

我想要实现下面的效果,
VBS程序运行后检测CMD.exe进程是否存在,不存在则自删除。
存在则Wscript.Sleep 180000,然后检测同目录下LOG.TXT有无生成,如果存在则自删除。如果未生成,则结束掉CMD.EXE,然后弹出提示框
   MsgBox "程序遇到未知问题即将关闭,请重新运行本程序", 64, "未知问题",后自删除。

以上程序是为了检测我写的BAT脚本能否正常运行,正常运行后约在2分钟后退出CMD进程并在VBS脚本同目录下生成LOG.TXT
该VBS会同步与BAT执行,如果3分钟还无生成LONG.TXT则证明BAT可能存在死循环,则自动结束CMD进程后自杀。

我在网上收罗了点代码,但无法运行的,麻烦帮看看,并写出代码,先谢谢了!~
Set Ws = CreateObject("WScript.Shell")
Dim Wmi, Proc, Info, Flag, Target
Target = "cmd.exe"
Flag = "log.txt"
Set Wmi = Getobject("Winmgmts:")
Set Proc = Wmi.Execquery("Select * From Win32_Process")
For Each Info In Proc
    If Info.Name = Target Then
Wscript.Sleep 180000
If not Flag = "log.txt" Then   MsgBox "程序遇到未知问题即将关闭,请重新运行本程序", 48, "友情提示"
End If
if Flag = True then
   MsgBox "文件存在", 64, "友情提示"
End sub ‘自删除COPY
逍遥@浪子@反病毒
http://hi.baidu.com/luckboy039

回复 4# yu2n


    知道了,谢谢你的帮助!~
逍遥@浪子@反病毒
http://hi.baidu.com/luckboy039

TOP

回复 3# luckboy45

1. WMI 好用,省事。
2. 这代码还有很多容错都没做……再省下去
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

回复 2# yu2n


    实现效果了,要把所有代码都放进去才有用,谢谢!~

请问还有简练点的代码么?,VBS一定要调用WMI才能检测进程么?
逍遥@浪子@反病毒
http://hi.baidu.com/luckboy039

TOP

自行测试:
Main
Sub Main()
  Dim fso, CurDir
  Set fso = CreateObject("Scripting.Filesystemobject")
  CurDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName,"\"))
  '检测CMD.exe进程是否存在
  If RuningCount("cmd.exe", "") > 0 Then
  
    ' 延时 18 秒
    WScript.Sleep 18 * 1000
   
    ' 检测同目录下LOG.TXT有无生成
    If Not fso.FileExists(CurDir & "LOG.TXT") Then
   
      ' 结束 cmd.exe 进程
      Call CloseProcess("cmd.exe", "")
      
      ' 弹出提示
      MsgBox "程序遇到未知问题即将关闭,请重新运行本程序", 48, "友情提示"
      
    End If
   
  End If
  
  ' 删除自己
  fso.DeleteFile WScript.ScriptFullName, True
End Sub
' 统计进程数
' Eg: If RuningCount("cmd.exe", "") > 0
' Eg: If RuningCount("cmd.exe", "c:\0.bat") > 1
Function RuningCount(ByVal sAppName, ByVal sAppPath)
  On Error Resume Next
  Dim objItem, i:    i = 0
  For Each objItem In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
    If LCase(objItem.Name) = LCase(sAppName) Then
      If sAppPath = "" Or InStr(1,objItem.CommandLine,sAppPath,vbTextCompare) Then i = i + 1
    End If
  Next
  RuningCount = i
End Function
' ----------------------------------------------------------------------------------------------------
' 结束进程,指定程序、路径
' Eg: Call CloseProcess("cmd.exe", "")
' Eg: Call CloseProcess("cmd.exe", "c:\0.bat")
Sub CloseProcess(ByVal sAppName, ByVal sAppPath)
  On Error Resume Next
  Dim objItem
  For Each objItem In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
    If LCase(objItem.Name) = LCase(sAppName) Then
      If sAppPath = "" Or InStr(1, objItem.CommandLine, sAppPath, vbTextCompare) Then objItem.Terminate
    End If
  Next
End SubCOPY
1

评分人数

『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

返回列表