Pdf 如何在VBScript中等待应用程序启动?

Pdf 如何在VBScript中等待应用程序启动?,pdf,vbscript,Pdf,Vbscript,我是一个新的VB脚本程序员,尝试使用VB脚本通过默认程序(本例中为Adobe Reader X)打开pdf文件并将其保存为文本文件 我的当前脚本打开PDF,等待1秒,然后将其保存为文本。但是,对于速度较慢的计算机,加载PDF可能需要1秒以上的时间。有人知道如何在文件打开或状态就绪之前进行睡眠循环吗 Set WshShell = WScript.CreateObject("WScript.Shell") WshShell.Run """C:\Temp\Gasprices.pdf""" Set o

我是一个新的VB脚本程序员,尝试使用VB脚本通过默认程序(本例中为Adobe Reader X)打开pdf文件并将其保存为文本文件

我的当前脚本打开PDF,等待1秒,然后将其保存为文本。但是,对于速度较慢的计算机,加载PDF可能需要1秒以上的时间。有人知道如何在文件打开或状态就绪之前进行睡眠循环吗

Set WshShell = WScript.CreateObject("WScript.Shell") 
WshShell.Run """C:\Temp\Gasprices.pdf"""
Set objShell = CreateObject("WScript.Shell") 
wscript.sleep 1000
objShell.SendKeys "%FAX%S"

首先,由于您是初学者,请始终使用
选项Explicit
。许多错误是由变量名中的输入错误引起的,如果您强迫自己声明所有使用的变量,您将捕获这些错误

其次,您不需要创建两个
WScript.Shell
对象,只需重新使用现有的一个即可

第三,您需要激活要向其发送命令的应用程序。这就是Shell对象的用途。它返回
True
False
,指示将相关应用程序带到前台是否有效。您可以在循环中使用它(
,而不是Shell.AppActivate(“Adobe Reader”)…
)来等待应用程序所需的时间

但是,缺点是您需要知道应用程序窗口的确切标题(或其进程ID)才能使其正常工作。应用程序标题可能会在没有警告的情况下更改,所以这有点不可靠。PID是鲁棒的,但它是不可猜测的

最后,您将需要WMI的帮助来列出所有进程,获取正确的PID,然后将其传递给
AppActivate
。这是专门为这个设计的

Dim Shell, WMI, pid
Set Shell = WScript.CreateObject("WScript.Shell") 
Set WMI = GetObject("winmgmts:!\\.\root\cimv2")

Shell.Run "start ""C:\Temp\Gasprices.pdf"""

pid = WaitForProcess("AcroRd32.exe", 5)

If pid > 0 Then
    Shell.AppActivate pid
    Shell.SendKeys "%FAX%S"
Else
    WScript.Echo "Could not talk to PDF reader"
    WScript.Quit 1
End If

Function WaitForProcess(imageName, tries)
    Dim wql, process

    wql = "SELECT ProcessId FROM Win32_Process WHERE Name = '" & imageName & "'"

    WaitForProcess = 0

    While tries > 0 And WaitForProcess = 0
        For Each process In WMI.ExecQuery(wql)
            WaitForProcess = process.ProcessId
        Next
        If WaitForProcess = 0 Then
            WScript.Sleep 1000
            tries = tries - 1
        End If
    Wend    
End Function
请注意,分配给函数名(如
WaitForProcess=0
)会设置返回值


您可以通过和查询来优化它

“从Win32_进程中选择ProcessId,其中ParentProcessId=”&scriptPID&“

WaitForProcess()

中,另一个可能的选项是测试进程CPU使用情况

您需要进行测试,看看这在您的环境中是否有效

Dim oShell, oExec, PID, X, Z
Set oShell = CreateObject("WScript.Shell")
Set oExec = oShell.Exec(Chr(34) & "C:\ADOBE PATH" & Chr(34) & " " & Chr(34) & "C:\YOUR PDF PATH.pdf" & Chr(34))
PID = oExec.ProcessID
WScript.Echo PID
'Prevent an Endless Loop
Z = 600  'about one minute worse case
Do
    WScript.Sleep 100
    X = GetCPUUsage(PID)
    WScript.Echo X
    Z = Z - 1
    If oExec.Status <> 0 Then
        MsgBox "The Process has been Terminated.  Ending Script"
        WScript.Quit
    End If
Loop Until X = 0 Or Z = 0
If Z > 0 Then
    WScript.Echo "Process Is More Or Less Opened"
Else
    WScript.Echo "Process is open...  Maybe?"
End If

Function GetCPUUsage(ProcID)
Dim objWMIService, colItems, objItem
Const wbemFlagReturnImmediately = &h10
Const wbemFlagForwardOnly = &h20
'Just in case
GetCPUUsage = 0
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2")
Set colItems = objWMIService.ExecQuery("SELECT PercentProcessorTime FROM Win32_PerfFormattedData_PerfProc_Process WHERE IDProcess = '" & ProcID & "'", _
    "WQL", wbemFlagReturnImmediately + wbemFlagForwardOnly)
For Each objItem In colItems
    GetCPUUsage = objItem.PercentProcessorTime
Next
End Function
Dim oShell、oExec、PID、X、Z
设置oShell=CreateObject(“WScript.Shell”)
设置oExec=oShell.Exec(Chr(34)&C:\adobepath&Chr(34)&Chr(34)&C:\YOUR PDF PATH.PDF&Chr(34))
PID=oExec.ProcessID
回音PID
防止无休止的循环
Z=600'约一分钟更糟的情况
做
WScript.Sleep 100
X=GetCPUUsage(PID)
Echo X
Z=Z-1
如果oExec.状态为0,则
MsgBox“进程已终止。正在结束脚本”
WScript.Quit
如果结束
循环直到X=0或Z=0
如果Z>0,则
Echo“进程或多或少已打开”
其他的
Echo“进程已打开…可能是吗?”
如果结束
函数GetCPUUsage(ProcID)
Dim objWMIService、colItems、objItem
Const WBEMFlagReturnInstant=&h10
常量wbemFlagForwardOnly=&h20
“以防万一
GetCPUUsage=0
设置objWMIService=GetObject(“winmgmts:\\。\root\CIMV2”)
设置colItems=objWMIService.ExecQuery(“从Win32_performatteddata_PerfProc_进程中选择PercentProcessorTime,其中IDProcess='”&ProcID&'”_
“WQL”,WBEMFlagReturn立即+wbemFlagForwardOnly)
对于每个对象,在colitem中
GetCPUUsage=objItem.PercentProcessorTime
下一个
端函数