我从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位上运行。
我可以用罕见的字符替换所有这些字符,然后在我的最终脚本中进行反向替换。
知道如何在没有任何“翻译”的情况下正确传递这些字符吗?
答案 0 :(得分:2)
如果在分批文件中将分号(;)或等号(=)用作命令行参数,则会将其视为空格。
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
""
这将照顾所有这些字符
ProcessBuilder builder =
new ProcessBuilder("cmd", "/c", "batch.bat", "\"a;b;c;d\"");