0

我从 Java 执行一个外部批处理文件并将一个特殊属性传递给它。我发现有几个字符被错误地传递给我的批处理文件。我找不到 ProcessBuilder 类中提到的任何限制,也找不到转义这些字符的方法。

public static void main(String[] args) throws IOException {
    /*
     * correct processing: almost everything (even #$*%:'\/~?)
     * fatal error:        |<>
     * trimming:           ;=&
     */
    ProcessBuilder builder = new ProcessBuilder("cmd", "/c", "batch.bat", "a;b;c;d");
    final Process process = builder.start();
    InputStream is = process.getInputStream();
    InputStreamReader isr = new InputStreamReader(is);
    BufferedReader br = new BufferedReader(isr);
    String line;
    while ((line = br.readLine()) != null) {
       System.out.println(line);
    }
    System.out.println("Program terminated!");
}

我的批处理文件只是

echo %1

上面的代码只打印分号 (a) 之前的第一个字符。

我在 Win7 和 JDK 7 64 位上运行它。

目前我用稀有的字符替换了所有这些字符,反向替换稍后在我的最终脚本中完成。

知道如何在没有任何“翻译”的情况下正确传递这些字符吗?

4

2 回答 2

2

微软支持网站表示

当分号 (;) 或等号 (=) 用作批处理文件中的命令行参数时,它被视为空格。

cmd /?表示

需要引号的特殊字符是:
     <空格>
     &()[]{}^=;!'+,`~

所以只需使用

batch.bat "a;b;c;d"

那是

new ProcessBuilder("cmd", "/c", "batch.bat", "\"a;b;c;d\"");

后来我发现输出是

“A B C D”
程序终止!

额外的"可能不是你想要的。用来剥掉%~1。也就是说,将您的 bat 文件更改为:

echo %~1
于 2013-06-26T12:09:26.883 回答
0

使用引用ProcessBuilder的最后一个参数创建您的""

ProcessBuilder builder =
               new ProcessBuilder("cmd", "/c", "batch.bat", "\"a;b;c;d\"");

这将照顾所有这些角色

// fatal error:        |<>
// trimming:           ;=&
于 2013-06-26T12:12:32.637 回答