我正在尝试从 java 代码执行外部命令,但我注意到两者之间存在差异Runtime.getRuntime().exec(...)
and new ProcessBuilder(...).start()
.
使用时Runtime
:
Process p = Runtime.getRuntime().exec(installation_path +
uninstall_path +
uninstall_command +
uninstall_arguments);
p.waitFor();
exitValue 为 0,命令正常终止。
然而,随着ProcessBuilder
:
Process p = (new ProcessBuilder(installation_path +
uninstall_path +
uninstall_command,
uninstall_arguments)).start();
p.waitFor();
退出值为 1001 并且命令在中间终止,尽管waitFor
返回。
我应该怎么做才能解决这个问题ProcessBuilder
?
各种超载Runtime.getRuntime().exec(...)
采用字符串数组或单个字符串。单串重载exec()
将字符串标记为参数数组,然后将字符串数组传递到其中之一exec()
采用字符串数组的重载。这ProcessBuilder
另一方面,构造函数只接受 varargs 字符串数组或List
字符串,其中数组或列表中的每个字符串都被假定为一个单独的参数。无论哪种方式,获得的参数都会被连接成一个字符串,传递给操作系统来执行。
例如,在 Windows 上,
Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
将运行一个DoStuff.exe
具有两个给定参数的程序。在这种情况下,命令行会被标记化并重新组合在一起。然而,
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");
将会失败,除非碰巧有一个名为DoStuff.exe -arg1 -arg2
in C:\
。这是因为没有标记化:假设要运行的命令已经被标记化。相反,你应该使用
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe", "-arg1", "-arg2");
或者替代地
List<String> params = java.util.Arrays.asList("C:\DoStuff.exe", "-arg1", "-arg2");
ProcessBuilder b = new ProcessBuilder(params);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)