【问题标题】:Runtime exec with arguments containing spaces带有包含空格的参数的运行时 exec
【发布时间】:2015-06-21 21:46:52
【问题描述】:

我正在尝试通过 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();

【问题讨论】:

  • 我认为在使用 Runtime.exec() 时不需要转义参数。参数应直接传输到目标应用程序,无需任何修改。
  • 切换到ProcessBuilder
  • 切换到具有相同args列表的ProcessBuilder没有效果。
  • @Richard:在 Windows 上,没有将数组传递给目标应用程序的安全方法,除非您已经知道特定应用程序如何解析其命令行字符串。

标签: java linux windows runtime.exec spaces


【解决方案1】:

我几周前开发的应用程序也遇到了同样的问题。最终,我放弃了使用原始的Runtime.exec() (pitfalls of Runtime.exec()) 并决定使用 Apache Commons Exec 库。它有助于解决开箱即用和执行过程中随机挂起的各种问题。它的addArguments() 方法采用handleQuoting 参数,所以我创建了一个简单的util 方法来检查操作系统并请求处理Windows 的引用,而对于Linux 我传递false。如果您想要一些工作示例,图书馆网站上有一些教程。你也可以看看我在Open LaTeX Studio项目中使用commons-exec的类。

【讨论】:

    【解决方案2】:

    看起来args中的空格根本没有问题,至少在Windows环境中进行测试。问题在于,如果复制源是文件或目录,xcopy 会提示 /halting 回答问题。我以为它在空间上窒息,但显然不是。我能够按原样使用问题中的代码,而不必使用 ProcessBuilder。

    【讨论】:

      【解决方案3】:

      在 Windows 上,如果有疑问,您应该使用 Runtime.exec 的重载之一,它采用字符串而不是字符串数组作为命令行参数。这允许您自己为新进程构建命令行字符串,因此您可以确保语法正确。

      如果使用数组方法,Java 必须将数组转换为单个字符串。它将使用标准算法来执行此操作,该算法假定目标进程使用 Microsoft C 运行时命令行解析器(或兼容的解析器)。这通常没问题,但并非总是如此。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-09
        • 2018-07-08
        • 1970-01-01
        • 2018-05-30
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        • 2023-03-11
        相关资源
        最近更新 更多