2017-02-10 31 views
1

我有一个使用VBS 运行指令调用另一个程序(.exe)的VBS脚本(实际编译为.exe)。我的大型机心态告诉我,在我的脚本开始时预加载第二个程序是有益的,这样在需要时可以立即使用。通常在大型机上,在适当的时候,可以将程序加载到内存中,然后稍后分支到内存中。在VBScript中预加载程序以更高效地执行

这个概念是否存在于VBS中?

感谢您的任何建议。

+2

您无法在VBScript中通过运行(或任何其他方式)预加载您正在启动的可执行文件。 –

+0

这很清楚。谢谢。 –

回答

0

在暂停状态下启动程序很容易,但是我仍然没有找到一种方法来在没有外部工具的情况下恢复执行(我们需要调用ResumeThread API)。对于此示例,我使用Windows SysInternal的PsSuspend工具来恢复过程。

Option Explicit 

Const SW_NORMAL = 1 
Const CF_CREATE_SUSPENDED = 4 

Const PROCESS_NAME = "Notepad.exe" 

' Instantiate required objects 
Dim wmi, shell 
    Set wmi = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2") 
    Set shell = WScript.CreateObject("WScript.Shell") 

' Prepare the startup configuration for the process 
' https://msdn.microsoft.com/en-us/library/aa394375%28v=vs.85%29.aspx 
Dim startUp 
    Set startUp = wmi.Get("Win32_ProcessStartup").SpawnInstance_ 
    With startUp 
     .ShowWindow = SW_NORMAL 
     .CreateFlags = CF_CREATE_SUSPENDED 
    End With 

' Start the process 
' https://msdn.microsoft.com/en-us/library/aa394372%28v=vs.85%29.aspx  
Dim retCode, processID 
    retCode = wmi.Get("Win32_Process").Create(PROCESS_NAME, Null, startUp, processID) 

    If retCode <> 0 Then 
     Wscript.Echo "Process creation failed: " & retCode 
     WScript.Quit 1 
    End If 
    WScript.Echo "Process created with PID: " & processID 

' Ask the OS to check for presence of our process  
    WScript.Echo shell.Exec("tasklist /fo:list /v /fi ""imagename eq " & PROCESS_NAME & """").StdOut.ReadAll() 

' Wait (not required, just for testing) 
    WScript.Sleep 5000 

' Resume the process - SysInternals pssuspend required 
' https://technet.microsoft.com/en-us/sysinternals/pssuspend.aspx 
    Call shell.Run("pssuspend64.exe /accepteula -r " & processID, 0, False) 

' Wait for the process to resume and show again the task list 
    WScript.Sleep 2000 
    WScript.Echo shell.Exec("tasklist /fo:list /v /fi ""imagename eq " & PROCESS_NAME & """").StdOut.ReadAll() 
+0

谢谢,但我怀疑的开销可能会超过收益,特别是因为...... 我使用以下两种方法之一编译脚本是: 1. Vbsedit将为 2. VBS_to_exe 我开始使用后者完全是在我注意到它产生的文件比前者小得多。然而,在我在这里追求我原来的帖子的问题时(当我执行我的脚本(由VBS-to_exe创建)时出现明显的延迟),我使用VBSEdit重新编译了脚本,并且瞧,延迟大大减少,到它基本上不成问题的地步。 我很满意:) –

+0

@BillFriedman,虽然没有找到一个纯粹的wmi原生做法,但几乎没有任何好处(取决于具体的可执行文件)。我发现这个问题很有趣,并决定测试并发布我发现的内容。感谢您提出不同方法的建议。 –

相关问题