确定通过我的脚本启动的程序是否仍在运行而不使用minmgmts://

时间:2014-04-21 20:30:22

标签: vbscript

简介

我有一台SSD,我经常用Fraps录制电影。不幸的是,我的SSD并不是那么大,而我的辅助硬盘驱动器不足以让Fraps录制电影。我决定编写一个脚本,为我启动Fraps,然后检查Fraps是否完成录制,将文件移动到我的第二个硬盘并通知我此事件。

这很有效。问题是我想在关闭Fraps时退出脚本。 VBScript似乎能够做到的唯一方法(至少,每个人都建议这样做)是通过查询进程列表来查看程序是否处于活动状态。因为Fraps是一个繁重的程序,并且我同时运行许多程序,所以查询此列表会在我的录音中产生滞后峰值。只有当我打开太多程序时才会发生这种情况,但程序本身不是问题,只是金额。

鉴于它只创造了一个滞后尖峰,一次检查已经太多了,所以如果有的话,我真的在寻找不同的解决方案。

Visual Basic

我已经在Visual Basic中进行了很多编程,即使它已经很多年了,后来又使用了VBA,在那里你基本上可以启动一个程序,检索它的句柄,并通过那个句柄单独检查应用程序是否仍在运行。 VBScript中是否存在类似的内容?

如果VBScript不会这样做,是否有另一个简单的宏脚本程序可以检查文件大小,执行程序并确定该程序是否仍然在脚本中运行?

我目前用于确定程序是否运行的代码是:

Function IsProcessRunning( strComputer, strProcess )
    Dim Process, strObject
    IsProcessRunning = False
    strObject   = "winmgmts://" & strComputer
    For Each Process in GetObject( strObject ).InstancesOf( "win32_process" )
        If UCase( Process.name ) = UCase( strProcess ) Then
            IsProcessRunning = True
            Exit Function
        End If
    Next
End Function

2 个答案:

答案 0 :(得分:2)

假设这是在您的本地计算机上,您是否尝试过从命令行收集结果而不是查询winmgmts对象?

例如:

Function IsProcessRunning(strProcess)
    Dim objShell, strCommand, objExecObject, strText
    Set objShell = CreateObject("Wscript.Shell")
    strCommand = "%comspec% /c tasklist"
    Set objExecObject = objShell.Exec(strCommand)

    Do While Not objExecObject.StdOut.AtEndOfStream
        strText = objExecObject.StdOut.ReadAll()
    Loop
    If instr(UCase(strText), UCase(strProcess)) Then
            IsProcessRunning = True
            Exit Function
    Else
            IsProcessRunning = False
            Exit Function
    End If
End Function

答案 1 :(得分:2)

我发现了如何使用我在Visual Basic中使用的方法来完成它,但是使用了我在研究Rich方法时学到的新东西。

即使Rich的方法不起作用,它也把我推向了正确的方向,所以我给了他一个投票权。

这是启动Fraps的脚本:

Dim oShell, oFraps
Set oShell = WScript.CreateObject( "WScript.Shell" )
set oFraps = oShell.exec("""c:\path\to\fraps\fraps.exe""") 

这是在Fraps退出之前一直保持循环的主要脚本。

do while IsProcessRunning()
    'your code here
loop
wscript.quit

这是查看Fraps是否仍在运行的功能。

Function IsProcessRunning()
    dim result
    result = oFraps.StdOut.readall
end function

我只是想看看上面是否抛出错误并使用错误捕获器来执行此操作,但是当这段代码使我的脚本工作时我感到非常惊讶!它为我启动了fraps,脚本继续运行,直到我关闭fraps。我使用sapi.speak在脚本开始和结束时通知我,并且我可以保持fraps打开很长时间并且我没有听到脚本结束。然后我关闭了fraps,片刻后脚本告诉我它已经结束了。