我有一个应用程序,我正在尝试运行Runtime.exec()调用。
由于某些参数有空格,我如何正确地转义参数,使其在Linux和Windows中都能正常工作?我知道在Windows中,你通常在带有空格的字符串周围使用双引号,而linux使用斜杠。
使用空格,我希望我正在运行的程序(Windows的xcopy)现在几乎立即返回并指示参数的数量是错误的。但是,waitFor()调用会挂起。
String[] commandArray = new String[3];
commandArray[0] = applicationPath;
commandArray[1] = someFileWhichMayHaveSpaces;
commandArray[2] = anotherFileWhichMayHaveSpaces;
Process appProcess = Runtime.getRuntime().exec(commandArray);
int returnCode = appProcess.waitFor();
答案 0 :(得分:3)
我和几周前开发的应用程序有同样的问题。最终,我放弃了使用原始Runtime.exec()
(pitfalls of Runtime.exec())并决定使用Apache Commons Exec库。它有助于解决开箱即用的各种问题,并在执行过程中随意挂起。它的addArguments()
方法需要handleQuoting
参数,所以我创建了一个简单的util方法来检查操作系统和我请求处理Windows的引用,而对于Linux,我传递了false。如果你想要一些有用的例子,那么图书馆网站上有一些教程。您还可以查看我在Open LaTeX Studio项目中使用commons-exec的类。
答案 1 :(得分:0)
看起来args中没有任何空间问题,至少在Windows环境中进行测试。问题是如果复制源是文件或目录,xcopy会提示/暂停对问题的响应。我以为它是在空间上窒息,但很可能不是。我能够按原样使用我在问题中的代码,而不必使用ProcessBuilder。
答案 2 :(得分:0)
在Windows上,如果有疑问,您应该使用Runtime.exec
的一个重载,它接受一个字符串而不是字符串数组作为命令行参数。这允许您自己为新进程构造命令行字符串,因此您可以确保语法正确。
如果使用数组方法,Java必须将数组转换为单个字符串。它将使用标准算法执行此操作,该算法假定目标进程使用Microsoft C运行时命令行解析器(或兼容的)。这通常可以,但并非总是如此。