当设置本地通信程序集时,我今天遇到了这个问题。基本上我的一个应用程序正在向另一个发送一些数据,其中一部分数据是一个包含要执行的命令的字符串(就像你从命令行那样)。比方说,例如:将预先转义的命令行参数传递给ProcessBuilder
g++ foo.cc bar.cc -o foobar
是我的第一个应用程序发送的命令。第二个接收命令(除其他之外)的应用程序需要在执行一些其他处理之后执行该命令。现在
,起初我以为这会使用是微不足道的一个ProcessBuilder
:
String exampleCommand = "g++ foo.cc bar.cc -o foobar";
ProcessBuilder builder = new ProcessBuilder(exampleCommand);
builder.start().waitFor();
然而这是哪里出现问题。
CreateProcess error=2, The system cannot find the file specified
好吧,别担心,我想我不能把整个东西都转储到生成器中。命令的第一部分通常是一个普通的字符串,所以我想我可能会绕第一个' '
分裂,以分离程序名和参数。
String exampleCommand = "g++ foo.cc bar.cc -o foobar";
String[] parts = exampleCommand.split(" ", 2);
ProcessBuilder builder = new ProcessBuilder(parts[0], parts[1]);
builder.start().waitFor();
这给我带来了一点点接近,则g++
文件现在可以正确地找到,但是检查的g++
的stderr
我认为发生以下错误后:
g++.exe: error: foo.cc bar.cc -o foobar: No such file or directory
此时我意识到ProcessBuilder
类必须转义为准备命令行传递给它的所有参数(因此它通常将参数作为单个参数的数组而不是仅仅预定义的参数字符串)的原因。
我的问题是,“是否有任何方法将参数的原始字符串传递给ProcessBuilder并说THERE,执行正确?
因为命令来自另一个应用程序,并且绝不是静态的,所以我不能将参数事先拆分成数组,并将它们正确地传递给ProcessBuilder
构造函数。这些论点并不那么简单,仅仅是围绕' '
分割字符串也可以正常工作;参数可能包含用双引号转义的空格。例如:
g++ "..\my documents\foo.cpp" bar.cpp -o foobar
可能是从应用和分裂来该字符串周围' '
并把它传递给ProcessBuilder
将导致腐败参数的命令。
如果没有正确的方法做到这一点有人可以请我指出一个独立的命令行参数解析器(Java),可以将命令行字符串变成有效的String[]
?