當設置本地通信程序集時,我今天遇到了這個問題。基本上我的一個應用程序正在向另一個發送一些數據,其中一部分數據是一個包含要執行的命令的字符串(就像你從命令行那樣)。比方說,例如:將預先轉義的命令行參數傳遞給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[]
?