逃避参数中的非法字符

时间:2013-06-26 11:50:08

标签: java cmd processbuilder

我从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位上运行。

我可以用罕见的字符替换所有这些字符,然后在我的最终脚本中进行反向替换。

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

2 个答案:

答案 0 :(得分:2)

Microsoft Support Site表示

  

如果在分批文件中将分号(;)或等号(=)用作命令行参数,则会将其视为空格。

cmd /?声明

The special characters that require quotes are:
     <space>
     &()[]{}^=;!'+,`~

所以只需使用

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

那是

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

后来我发现输出是

"a;b;c;d"
Program terminated!

额外的"可能不是您想要的。 Use %~1 to strip it off。也就是说,将您的bat文件更改为:

echo %~1

答案 1 :(得分:0)

使用ProcessBuilder

创建带有引用的最后一个参数<{1}}的{​​{1}}
""

这将照顾所有这些字符

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