我正在寻找一种等待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();
提前致谢
答案 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());
}
}
}
尝试次数和睡眠延迟可以设置为参数。