【发布时间】:2011-07-31 20:09:00
【问题描述】:
我有一些 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 是一个包含上述命令的字符串。现在,我知道的事情是;
- 我真的应该使用重载的 Runtime.exec(String[]) 方法
- 该命令混合使用正斜杠和反斜杠
这些是有效的 cmets,我可能最终会解决问题,但我要解决的是为什么完全相同的代码在 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 代码。同样,斜线方向的混合我认为没有问题,因为这种混合物在一台机器上工作。
在我看来,它应该在每台机器上都失败。不只是其中之一。
显然,如果一切都完全相同,它会在每台机器上损坏(或工作)。但是我想看的所有东西都是相同的。
其他人可以提出其他要考虑的建议吗?
非常感谢。
【问题讨论】:
-
每个盒子上 %APP_HOME% 的值是多少?您是否确信每台机器上都安装了相同版本的可执行文件,并且具有相同的用户设置和文件权限?
-
你在所有机器上的命令shell中都试过这个命令吗,如果能重现问题肯定不是java问题...
标签: java windows process command runtime.exec