在执行java代码之前等待提升的vbscript完成

时间:2017-08-23 17:17:32

标签: java vbscript

我正在寻找一种等待vbscript完成执行的方法,然后继续执行java代码。我有一个进程调用脚本,它工作正常,并且waitFor()停止执行,直到它完成。问题是脚本在启动时以管理员权限重新启动。由于进程在重新启动时完成,因此在程序继续之前脚本没有时间执行。

有没有办法让程序等待这个提升的脚本运行,或者以不需要使用提升的权限重新启动它的方式启动脚本?

这就是我提升剧本的方式

If Not WScript.Arguments.Named.Exists("elevate") Then
CreateObject("Shell.Application").ShellExecute WScript.FullName _
, """" & WScript.ScriptFullName & """ /elevate //nologo" , "", "runas", 1
WScript.Quit
End If

这就是我打电话等待这个过程的方式。

Process child = Runtime.getRuntime().exec("cscript 
C:\\some\\path\\name\\scriptName.vbs");
child.waitFor();

提前致谢

2 个答案:

答案 0 :(得分:0)

简单:使用两个不同的脚本!

第一个是由Java代码启动的。该脚本使用提升的权限启动第二个脚本。并等待第二个脚本完成。

然后,当两个脚本都完成后,Java将继续运行!

否则,您需要为单个脚本实现一些其他(复杂!)方式,以便将“信号”发送到另一个JVM线程。复杂且容易出错。

关于如何执行此操作的问题:例如,请参阅here

答案 1 :(得分:0)

我遇到了同样的问题,从 Java 执行 VBA 脚本并等待它完成:

  Runtime.getRuntime().exec(new String[]{"C:\\Windows\\System32\\wscript.exe", "C:/macro.vbs"});

宏包含在 Excel 文件中运行宏 (generateOutputFiles) 的 VBS 代码:

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\excel\test.xls")
objExcel.Application.EnableEvents = False
objExcel.Application.DisplayAlerts = False
objExcel.Application.Run "test.xls!generateOutputFiles"
objExcel.ActiveWorkbook.Save
objExcel.ActiveWorkbook.Close

经过漫长而痛苦的研究,我决定在VB脚本的主程序结束后在它本身上创建一个标志,并在Java代码中等待,如下所示:

在 VBA 中:

Set objExcel = CreateObject("Excel.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")
' Delete the exesting end execution flag
endLoadingFlagPath = "C:\excel\LOADING_END_FLAG"
If (objFSO.FileExists(endLoadingFlagPath)) Then
   objFSO.DeleteFile endLoadingFlagPath
End If

Set objExcel = CreateObject("Excel.Application")
Set objWorkbook = objExcel.Workbooks.Open("C:\excel\test.xls")
objExcel.Application.EnableEvents = False
objExcel.Application.DisplayAlerts = False
objExcel.Application.Run "test.xls!generateOutputFiles"
objExcel.ActiveWorkbook.Save
objExcel.ActiveWorkbook.Close
' Create the end execution flag right after the main VB program
Set objFile = objFSO.CreateTextFile(endLoadingFlagPath)

在 Java 中:

import java.io.File;
import java.util.concurrent.TimeUnit;

import org.apache.log4j.Logger;



public class Test {

private static final Logger logger = Logger.getLogger("SCRIPT_RUNNER");

    public void executeVBScript() throws Exception {
        Runtime.getRuntime().exec(new String[]{"C:\\Windows\\System32\\wscript.exe", "C:/macro.vbs"});
        waitLoadingFinished();
    }

    private void waitLoadingFinished() throws Exception {
        File endLoadingFlagFile = new File("C:\\excel\\LOADING_END_FLAG");
        for(int attempt = 0; attempt < 10; attempt++) {
            utilSetDelay(5);
            if(endLoadingFlagFile.exists()) {
                return;
            }
        }
        throw new Exception("Timeout waiting for task");
    }

    private void utilSetDelay(long seconds) {
        try {
            TimeUnit.SECONDS.sleep(seconds);
        } catch(Exception ex) {
            logger.warn("Cannot sleep:" + ex.getMessage());
        }
    }
}

尝试次数和睡眠延迟可以设置为参数。