2013-10-23 45 views
0

当设置本地通信程序集时,我今天遇到了这个问题。基本上我的一个应用程序正在向另一个发送一些数据,其中一部分数据是一个包含要执行的命令的字符串(就像你从命令行那样)。比方说,例如:将预先转义的命令行参数传递给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[]

回答

2

好吧,我现在感觉很愚蠢,但我通过简单地恢复到好的旧Runtime.getRuntime().exec(...)达到我想要的结果。我会留下这个问题以防万一有人像我一样愚蠢,并发现它很有用。

String exampleCommand = "g++ foo.cc bar.cc -o foobar"; 
Runtime sys = Runtime.getRuntime(); 
sys.exec(exampleCommand); 

简单。

1

到调用Runtime.getRuntime()EXEC(...)解决方案注释:。

的调用Runtime.getRuntime()EXEC(...)不好了。在OSX El Capitan上执行的java中,'Runtime.getRuntime().exec(...)'包含一个错误,有时会在java程序退出时关闭打开的进程。它在以前的OSX版本上工作正常。但是,ProcessBuilder适用于所有OSX版本。

(尚未发布足够的代表点以使其成为正常评论。)