Runtime.getRuntime()。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”的系统variables。

我得到的错误是这样的:

特定于应用程序的错误消息:无法打开某个日志或“相关文件”:d:/ path / to / program \ logs。 errno = 13,权限被拒绝

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

 Runtime.getRuntime().exec(cmdStr); 

其中cmdStr是一个包含上述命令的string。 现在,我知道的是,

  1. 我真的应该使用重载的Runtime.exec(String [])方法
  2. 该命令使用正斜杠和反斜杠的组合

这些是有效的评论,我可能最终会解决这个问题,但是我正在努力解决的是为什么完全相同的代码在四台机器中只有三台出现故障。

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

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

 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%引用已被replace为-errorlogname参数的绝对path。 但是这个variables已经被放在了可执行文件的位置。

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

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

显然,如果一切都完全相同,那么在每台机器上都会中断(或工作)。 但是我所看到的所有东西都是一样的。

任何人都可以提出其他build议吗?

非常感谢。

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