我正在尝试从Java代码执行外部命令,但我注意到了Runtime.getRuntime().exec(...)和之间的区别new ProcessBuilder(...).start()。
Runtime.getRuntime().exec(...)
new ProcessBuilder(...).start()
使用时Runtime:
Process p = Runtime.getRuntime().exec(installation_path + uninstall_path + uninstall_command + uninstall_arguments); p.waitFor();
exitValue为0,命令终止正常。
但是,使用ProcessBuilder:
ProcessBuilder
Process p = (new ProcessBuilder(installation_path + uninstall_path + uninstall_command, uninstall_arguments)).start(); p.waitFor();
退出值为1001,尽管waitFor返回,该命令在中间终止。
1001
waitFor
我该怎么办才能解决问题ProcessBuilder?
各种重载Runtime.getRuntime().exec(...)可以采用字符串数组或单个字符串。exec()在将字符串数组传递到采用字符串数组的exec()重载之一之前,的单字符串重载将把字符串标记为参数数组。的ProcessBuilder构造,在另一方面,只需要一可变参数串或阵列List串,其中假定该阵列或列表中的每个字符串为一个单独的参数。不管哪种方式,然后将获得的参数合并为一个字符串,然后将其传递给OS以执行。
exec()
List
OS
因此,例如在Windows上,
Runtime.getRuntime().exec("C:\DoStuff.exe -arg1 -arg2");
将DoStuff.exe使用两个给定参数运行程序。在这种情况下,命令行将被标记化并放回原处。然而,
DoStuff.exe
ProcessBuilder b = new ProcessBuilder("C:\DoStuff.exe -arg1 -arg2");
将失败,除非恰好是他的名字是一个程序DoStuff.exe -arg1 -arg2在C:\。这是因为没有标记化:假定运行的命令已经被标记化。相反,你应该使用
DoStuff.exe -arg1 -arg2在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);