简介
我有一台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
答案 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,片刻后脚本告诉我它已经结束了。