VBScript - 如何让程序等到进程完成?

qwe*_*ace 8 vbscript excel vba excel-vba excel-2010

我在使用VBA/Excel宏和HTA的VBScript中遇到问题.问题只是VBScript,我有另外两个组件,即VBA宏和HTA前端工作完美.但在我解释这个问题之前,我想你帮助我,我必须帮助你理解VBScript的背景.

因此,基本上所有组件(VBScript,VBA宏和HTA)都是我正在构建的工具的一部分,以自动化一些手动琐事.它几乎是这样的:

A - HTA

~~~~~~~~~~~~

  1. 用户从HTA/GUI中选择一些文件.
  2. 在HTA的HTML中,"SCRIPT"标签中有一些VBScript,它将用户的4个输入文件作为参数传递给VBScript(由WScript.exe执行 - 为了清楚起见,您可以参考注释#1)
  3. 该脚本,从现在开始调用myScript.vbs然后处理4个参数,其中3个是特定文件,第4个是包含多个文件的路径/文件夹位置 - (为清晰起见,请参阅注释#2)

B - myScript.vbs

~~~~~~~~~~~~

  1. myScript.vbs打开前3个参数,这些参数是Excel文件.其中一个是带有我的VBA宏的*.xlsm文件.
  2. myScript.vbs然后使用第4个参数作为包含多个文件的文件夹的PATH,并将其分配给变量,以便在调用GetFolder时传递给FileSystemObject对象,即

    ... 'Other code here, irrelevant for this post
    Dim FSO, FLD, strFolder
    ... 'Other code here, irrelevant for this post
    arg4 = args.Item(3)
    strFolder = arg4
    Set FSO = CreateObject("Scripting.FileSystemObject"
    'Get a reference to the folder you want to search
    Set FLD = FSO.GetFolder(strFolder)
    ...
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从这里我创建一个循环,以便我可以顺序打开文件夹中的文件,然后运行我的宏,即

    ...
    Dim strWB4, strMyMacro
    strMyMacro = "Sheet1.my_macro_name"
    
    'loop through the folder and get the file names
    For Each Fil In FLD.Files
    
        Set x4WB = x1.Workbooks.Open(Fil)
    x4WB.Application.Visible = True
    
    x1.Run strMyMacro
    
    x4WB.close
    Next 
    ...
    
    Run Code Online (Sandbox Code Playgroud)

请注意,当前三个Excel文件打开时(由循环前的代码控制,此处未显示,因为我对该部分没有任何问题)我必须保持它们打开.

它是文件夹中的文件(作为第4个参数传递),必须按顺序打开和关闭.但是在打开和关闭之间,我需要VBA /宏(在之前打开的3个Excel文件中的一个中写入)在每次循环迭代时运行并从文件夹中打开一个新文件(我希望你关注 - 如果不是请让我知道:)).

我遇到的问题是文件夹中的文件打开和关闭,打开和关闭n次(n =文件夹中的文件数,当然),而不等待宏运行.这不是我想要的.我在'x1.Run strMyMacro'语句之后尝试了WScript.sleep语句,延迟了10秒,但无济于事.

有任何想法吗?

谢谢,QF.

笔记:

1 - 为了简单/清晰,这是如何:

    strCMD = cmd /c C:\windows\system32\wscript.exe myScript.vbs <arg1> <arg2> <arg3> <arg4>
    'FYI - This is run by creating a WShell object, wsObj, and using the .run method, i.e. WShell.run(strCMD)
Run Code Online (Sandbox Code Playgroud)

2 HTA使用一段JavaScript来剥离用户的第四个输入文件(HTML:INPUT TYPE ="file")并将其传递给HTA中的VBScript.这让我解决了无法在HTML中专门选择FOLDER的问题.

pet*_*ter 18

您需要告诉运行等待进程完成.就像是:

const DontWaitUntilFinished = false, ShowWindow = 1, DontShowWindow = 0, WaitUntilFinished = true
set oShell = WScript.CreateObject("WScript.Shell")
command = "cmd /c C:\windows\system32\wscript.exe <path>\myScript.vbs " & args
oShell.Run command, DontShowWindow, WaitUntilFinished
Run Code Online (Sandbox Code Playgroud)

在脚本本身,像这样启动Excel.调试启动时可见:

File = "c:\test\myfile.xls"
oShell.run """C:\Program Files\Microsoft Office\Office14\EXCEL.EXE"" " & File, 1, true
Run Code Online (Sandbox Code Playgroud)


小智 5

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2:Win32_Process")
objWMIService.Create "notepad.exe", null, null, intProcessID
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colMonitoredProcesses = objWMIService.ExecNotificationQuery _
    ("Select * From __InstanceDeletionEvent Within 1 Where TargetInstance ISA 'Win32_Process'")
Do Until i = 1
    Set objLatestProcess = colMonitoredProcesses.NextEvent
    If objLatestProcess.TargetInstance.ProcessID = intProcessID Then
        i = 1
    End If
Loop
Wscript.Echo "Notepad has been terminated."
Run Code Online (Sandbox Code Playgroud)