Runtime.getRuntime()。exec()的奇怪行为

时间:2011-04-07 16:00:26

标签: java windows process command runtime.exec

我有一些Java代码在Windows机器上执行某个命令。然而,它的行为是奇怪的,因为相同的命令在一台机器上工作,但在其他三台机器上失败。据我所知,这四台机器中的每一台都是相同的。

命令是这样的:

cmd /c %APP_HOME%\..\..\some\more\path\executable -arg1=value1 -arg2=value2 -errorlogname=%APP_HOME%\logs\errors.log -arg3 some more parameters

其中%APP_HOME%是设置为值“D:/ path / to / program”的系统变量。

我得到的错误是:

  

有关无法打开其中一个日志或“相关文件”的特定于应用程序的错误消息:   d:/路径/到/程序\日志。 errno = 13,权限被拒绝

我使用的Java看起来像这样:

Runtime.getRuntime().exec(cmdStr);

其中cmdStr是包含上述命令的String。现在,我所知道的是;

  1. 我应该使用重载的Runtime.exec(String [])方法
  2. 该命令使用正斜杠和反斜杠的混合
  3. 这些是有效的评论,我可能最终会解决这个问题,但我正在努力解决的问题是为什么完全相同的代码在4台机器上的 3中失败。

    是的,该命令中提到的所有路径都存在于框中。

    它变得更奇怪了。如果我执行以下(非常相似)命令,它在所有四个框上都能正常工作。

    cmd /c %APP_HOME%\..\..\some\more\path\executable -arg1=value1 -arg2=value2 -errorlogname=D:\path\to\program\logs\errors.log -arg3 some more parameters
    

    在上面的工作版本中,唯一的区别是%APP_HOME%引用已被-errorlogname参数的绝对路径替换。但是变量已经指向可执行文件的位置。

    现在,相同的代码在一个盒子上正常运行的事实让我怀疑问题不是Java代码。同样,斜线方向的混合我认为不是问题,因为这种混合在一台机器上工作。

    在我看来,它应该在每台机器上失败。不只是其中之一。

    显然,如果一切都真的相同,它会在每台机器上破坏(或工作)。但是我想到的所有事情都是相同的。

    其他人可以提出其他建议吗?

    非常感谢。

1 个答案:

答案 0 :(得分:2)

我怀疑%APP_HOME%实际上没有在失败的机器上设置,但您恰好在正确的目录中启动脚本,以便可执行文件的相对路径生效。要进一步调试,您必须通过打印来实际验证%APP_HOME%是否具有正确的值。