【发布时间】:2014-10-29 00:33:24
【问题描述】:
在 Windows 7(64 位)和 Office 2010 的 Word VBA 宏中,我正在对 java 进行 Shell 调用以执行 .jar 文件。该代码是分发的一部分,据说可以在 Office 2007 中运行(我没有)。
ShellCommand = "java -classpath ..."
TaskID = Shell(ShellCommand, ShellWindowState)
无论如何,Shell 命令返回一个进程 ID,但该进程立即终止,没有 Err.Number 我实际上无法获得太多关于原因的信息。
但是,我怀疑它找不到java 命令。我通过手动打开CMD.exe 窗口并运行ShellCommand(我使用Debug.Print 打印)来验证我的PATH 是否正确。实际上,我的 PATH 变量设置为指向最新 JRE 的安装位置,这也可以通过键入 java -version 并看到正确的输出来证明。
所以,仍然不信任来自 VBA 的 Shell,我将 ShellCommand 硬编码如下:
ShellCommand = "c:\Program Files\Java\jdk1.7.0_72\jre\bin\java -classpath ..."
令我惊讶的是,Shell 命令可以正常工作,并且我的 .jar 已按应有的方式执行。
那么,谁能告诉我为什么ShellCommand 中忽略了系统PATH 变量,或者更好的是,我如何编写我的VBA 程序,以便每当我在Windows 7 上更新我的JRE(java.exe 是一个似乎每隔几周移动一次目标),它会找到java.exe?
【问题讨论】:
-
您也许可以使用
Environ("PATH")来获取它。 msdn.microsoft.com/en-us/library/office/… -
感谢@RubberDuck - 我从 VBA 检查了 PATH 值,这让我开始思考。查看编辑。 Java 8 运行时似乎是罪魁祸首。我太累了,无法重新安装它(看看问题是否再次出现)。
-
您应该将您的解决方案添加为答案,如果问题“已关闭”,请接受它:)
-
我倾向于发现使用
CreateObject("WScript.Shell").Exec("CMD /C " & ShellCommand).StdOut.ReadAll有助于从您的 shell 命令中检索输出。此外,我认为 VBA 在扩展变量时不会像 CMD 那样添加必需的引号,因此如果您的路径包含诸如“..\Program Files\”之类的空格,您将需要手动添加额外的引号,例如Shell("""" & Environ("PATH") & """" & ShellCommand, ShellWindowState)希望这是有道理的......
标签: vba shell java-8 ms-word executable-jar