Board logo

标题: [问题求助] [已解决]VBS怎样检测进程的同时检测文件? [打印本页]

作者: luckboy45    时间: 2015-1-18 08:58     标题: [已解决]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进程后自杀。

我在网上收罗了点代码,但无法运行的,麻烦帮看看,并写出代码,先谢谢了!~
  1. Set Ws = CreateObject("WScript.Shell")
  2. Dim Wmi, Proc, Info, Flag, Target
  3. Target = "cmd.exe"
  4. Flag = "log.txt"
  5. Set Wmi = Getobject("Winmgmts:")
  6. Set Proc = Wmi.Execquery("Select * From Win32_Process")
  7. For Each Info In Proc
  8.     If Info.Name = Target Then
  9. Wscript.Sleep 180000
  10. If not Flag = "log.txt" Then   MsgBox "程序遇到未知问题即将关闭,请重新运行本程序", 48, "友情提示"
  11. End If
  12. if Flag = True then
  13.    MsgBox "文件存在", 64, "友情提示"
  14. End sub ‘自删除
复制代码

作者: yu2n    时间: 2015-1-18 21:39

自行测试:
  1. Main
  2. Sub Main()
  3.   Dim fso, CurDir
  4.   Set fso = CreateObject("Scripting.Filesystemobject")
  5.   CurDir = Left(WScript.ScriptFullName, InStrRev(WScript.ScriptFullName,"\"))
  6.   '检测CMD.exe进程是否存在
  7.   If RuningCount("cmd.exe", "") > 0 Then
  8.   
  9.     ' 延时 18 秒
  10.     WScript.Sleep 18 * 1000
  11.    
  12.     ' 检测同目录下LOG.TXT有无生成
  13.     If Not fso.FileExists(CurDir & "LOG.TXT") Then
  14.    
  15.       ' 结束 cmd.exe 进程
  16.       Call CloseProcess("cmd.exe", "")
  17.       
  18.       ' 弹出提示
  19.       MsgBox "程序遇到未知问题即将关闭,请重新运行本程序", 48, "友情提示"
  20.       
  21.     End If
  22.    
  23.   End If
  24.   
  25.   ' 删除自己
  26.   fso.DeleteFile WScript.ScriptFullName, True
  27. End Sub
  28. ' 统计进程数
  29. ' Eg: If RuningCount("cmd.exe", "") > 0
  30. ' Eg: If RuningCount("cmd.exe", "c:\0.bat") > 1
  31. Function RuningCount(ByVal sAppName, ByVal sAppPath)
  32.   On Error Resume Next
  33.   Dim objItem, i:    i = 0
  34.   For Each objItem In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
  35.     If LCase(objItem.Name) = LCase(sAppName) Then
  36.       If sAppPath = "" Or InStr(1,objItem.CommandLine,sAppPath,vbTextCompare) Then i = i + 1
  37.     End If
  38.   Next
  39.   RuningCount = i
  40. End Function
  41. ' ----------------------------------------------------------------------------------------------------
  42. ' 结束进程,指定程序、路径
  43. ' Eg: Call CloseProcess("cmd.exe", "")
  44. ' Eg: Call CloseProcess("cmd.exe", "c:\0.bat")
  45. Sub CloseProcess(ByVal sAppName, ByVal sAppPath)
  46.   On Error Resume Next
  47.   Dim objItem
  48.   For Each objItem In GetObject("winmgmts:\\.\root\cimv2:win32_process").instances_
  49.     If LCase(objItem.Name) = LCase(sAppName) Then
  50.       If sAppPath = "" Or InStr(1, objItem.CommandLine, sAppPath, vbTextCompare) Then objItem.Terminate
  51.     End If
  52.   Next
  53. End Sub
复制代码

作者: luckboy45    时间: 2015-1-19 07:28

回复 2# yu2n


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

请问还有简练点的代码么?,VBS一定要调用WMI才能检测进程么?
作者: yu2n    时间: 2015-1-19 08:30

回复 3# luckboy45

1. WMI 好用,省事。
2. 这代码还有很多容错都没做……再省下去
作者: luckboy45    时间: 2015-1-20 17:13

回复 4# yu2n


    知道了,谢谢你的帮助!~




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2