【问题标题】:Illegal argument on start process关于启动过程的非法争论
【发布时间】:2012-10-27 01:38:49
【问题描述】:

我有一些控制台实用程序。我开始使用一些参数执行此实用程序的过程。一个参数是文件名。

如果文件名不包含空格,则一切正常。但是有空格我从实用程序中得到错误:“没有这样的文件或目录”。如果我设置文件名参数,仍然不起作用。但感兴趣:如果我从命令行(而不是从 android/java)调用实用程序,一切正常。如果我替换 %20 上的空间,无论如何都不起作用:

1) 文件名(原始):util dir\some test.txt - 无效(java、cmd)。这很正常。

2) 文件名 (quates): util "dir\some test.txt" - 在 cmd 中工作,在 java 中不工作。

3) 文件名(编码):util "dir\some%20test.txt" - 无效(java、cmd)。

PS:实用程序是 ffmpeg

【问题讨论】:

    标签: java android linux process runtime


    【解决方案1】:

    在 Java 中使用 dir\\some test.txtdir/some test.txt

    请注意: \ 是 Java 中的特殊字符(转义)。如果您需要使用 \ 作为示例中的文字,则应将其转义为添加 \ 字符。

    【讨论】:

      【解决方案2】:

      当您启动程序时,每个空格都被注册为一个新的“arg”,因此将其拆分为空格意味着程序认为有更多的 args,而不是按照您希望的方式读取文件名。引号仅在 CMD 中有效,因为语法旨在让它如此。你需要一个转义键试试双反斜杠“\\”,看看这里llegal-escape-character-followed-by-a-space

      【讨论】:

        【解决方案3】:

        我假设您尝试在 Java 中运行 util "dir\some test.txt",如下所示:

        System.exec("util \"dir\\some test.txt\"");
        

        或类似的东西。如果是这样,那么问题在于exec 方法将命令字符串拆分为参数的简单方式。它只是将任何空白字符序列视为参数分隔符不考虑引用。所以,上面实际上是传递util 命令参数"dir\sometest.txt" ...这将导致它找不到文件。

        解决这个问题的最好方法是使用exec 的重载,在其中传递一个字符串数组;例如

        System.exec(new String[]{"util", "dir\\some test.txt"});
        

        记录在案:

        • util "dir\some test.txt" 在 CMD 中工作,因为 CMD 语言支持使用双引号进行引用。你可以用 POSIX shell 做类似的事情。

        • util "dir\some%20test.txt" 失败,因为 CMD 语言不理解百分比转义。 URL 中使用了百分比转义...除非相关命令需要 URL 参数,否则它将把 % 字符视为普通文件名字符。

        最后,“随机”尝试不同类型的引用和转义并不是解决问题的好方法。在尝试解决问题之前,您应该真正尝试了解问题...

        【讨论】:

          【解决方案4】:

          我知道特殊字符。我没有手动设置文件名。我有一些文件,使用getAbsoluteFile() 和所有反斜杠都可以。

          我执行流程为:

              ProcessBuilder pbuilder = new ProcessBuilder(cmd);
              Process proc = pbuilder.start();
          

          cmd 是我的命令:util 文件名

          UPD:

          现在使用带有参数 String[] 的 ProcessBuilder。工作。

          【讨论】:

            猜你喜欢
            • 2012-04-24
            • 2010-10-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多