VBA中的Shell命令未使用PATH变量(从VBA执行.jar文件)

4
在 Windows 7 (64位) 和 Office 2010 中的 Word VBA 宏中,我正在使用 Shell 调用 java 来执行一个 .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 文件也按照预期执行了。

那么,谁能告诉我为什么系统中的 PATH 变量在 ShellCommand 中被忽略了呢?或者更好的方法是,我如何编写 VBA 程序,以便在 Windows 7 上更新 JRE (每隔几周就会出现一个移动目标的 java.exe),它就能找到 java.exe


你可以尝试使用 Environ("PATH") 来获取它。http://msdn.microsoft.com/en-us/library/office/gg264486(v=office.15).aspx - RubberDuck
感谢@RubberDuck - 我已检查了来自VBA的PATH值,这让我产生了一些想法。请查看编辑内容。似乎是Java 8运行时造成了问题。我太累了,无力重新安装它(以查看问题是否会再次出现)。 - Fuhrmanator
如果问题已经“关闭”,您应该将您的解决方案作为答案添加并接受它 :) - tolanj
我倾向于使用CreateObject("WScript.Shell").Exec("CMD /C " & ShellCommand).StdOut.ReadAll来检索您的shell命令的输出。此外,我认为VBA在扩展变量时不像CMD那样添加所需的引号,因此如果您的路径包含空格,例如“..\Program Files\”,则需要手动添加额外的引号,例如:Shell("""" & Environ("PATH") & """" & ShellCommand, ShellWindowState)希望这有意义... - SierraOscar
1个回答

1

TL;DR: 移除Java 8

我的Java安装清单显示了一些复杂性(!)

  • Java 7 Update 72
  • Java 7 Update 72 (64位)
  • Java SE Development Kit 7 Update 72 (64位)
  • Java 8 Update 25

我使用Environ("PATH")显示的PATH的第一部分显示为C:\ProgramData\Oracle\Java\javapath,这是一个以下SYMLINK的集合:

C:\ProgramData\Oracle\Java\javapath>dir

 Directory of C:\ProgramData\Oracle\Java\javapath

2014-10-16  10:32    <DIR>          .
2014-10-16  10:32    <DIR>          ..
2014-10-16  10:32    <SYMLINK>      java.exe [C:\Program Files (x86)\Java\jre1.8.0_25\bin\java.exe]
2014-10-16  10:32    <SYMLINK>      javaw.exe [C:\Program Files (x86)\Java\jre1.8.0_25\bin\javaw.exe]
2014-10-16  10:32    <SYMLINK>      javaws.exe [C:\Program Files (x86)\Java\jre1.8.0_25\bin\javaws.exe]

作为一个实验,我删除了Java 8。
这将使javapath设置如下(即Java 7 64位):
C:\ProgramData\Oracle\Java\javapath>dir

 Directory of C:\ProgramData\Oracle\Java\javapath

2014-10-28  21:14    <DIR>          .
2014-10-28  21:14    <DIR>          ..
2014-10-28  21:14    <SYMLINK>      java.exe [C:\Program Files\Java\jre7\bin\java.exe]
2014-10-28  21:14    <SYMLINK>      javaw.exe [C:\Program Files\Java\jre7\bin\javaw.exe]
2014-10-28  21:14    <SYMLINK>      javaws.exe [C:\Program Files\Java\jre7\bin\javaws.exe]

现在我的VBA应用程序可以运行而不需要硬编码路径到java.exe

我假设被忽略的PATH变量是错误的。

我的新假设是,当从Shell调用Java 8(32位)时,它无法正常工作,因为它在cmd.exe窗口中执行.jar文件(具有相同的路径)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接