标题: [问题求助] [已解决]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进程后自杀。
我在网上收罗了点代码,但无法运行的,麻烦帮看看,并写出代码,先谢谢了!~- 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 ‘自删除
复制代码
作者: yu2n 时间: 2015-1-18 21:39
自行测试:- 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 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://bathome.net./) |
Powered by Discuz! 7.2 |