【问题标题】:Shell command in VBA not using the PATH variable (executing .jar from VBA)VBA 中的 Shell 命令不使用 PATH 变量(从 VBA 执行 .jar)
【发布时间】: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


【解决方案1】:

TL;DR:删除 Java 8

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

  • Java 7 更新 72
  • Java 7 更新 72(64 位)
  • Java SE 开发工具包 7 更新 72(64 位)
  • Java 8 更新 25

我用Environ("PATH") 显示的PATH 的第一部分显示C:\ProgramData\Oracle\Java\javapath,它是一组SYMLINKs,如下所示:

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 变量被忽略的假设是错误的。

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

【讨论】:

    猜你喜欢
    • 2011-01-18
    • 2017-10-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-12
    相关资源
    最近更新 更多