簡體   English   中英

將預轉義的命令行參數傳遞給ProcessBuilder

[英]Passing pre-escaped command-line arguments to 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並說在那里,完全執行此操作?”

因為該命令來自另一個應用程序,並且絕不是靜態的,所以我不能只是將參數預先分解為數組,然后將其正確傳遞給ProcessBuilder構造函數。 這些參數並不是那么簡單,以至於簡單地在' '周圍分割字符串也可以正常工作。 參數可能包含用雙引號引起來的空格。 例如:

g++ "..\my documents\foo.cpp" bar.cpp -o foobar

可能是來自應用程序的命令,並且在' '周圍拆分該字符串並將其傳遞給ProcessBuilder會導致參數損壞。

如果沒有適當的方法可以執行此操作,請有人將我指向一個獨立的命令行參數解析器(在Java中),該解析器可以將命令行字符串轉換為有效的String[]嗎?

好的,我現在覺得自己很愚蠢,但是我通過簡單地恢復到舊的Runtime.getRuntime().exec(...)達到了預期的結果。 萬一有人像我一樣愚蠢,我會把這個問題擱置一旁,並發現它很有用。

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

簡單。

對Runtime.getRuntime()。exec(...)解決方案的注釋:

Runtime.getRuntime()。exec(...)不再好。 在OSX El Capitan上執行的Java中,“ Runtime.getRuntime()。exec(...)”包含一個錯誤,該錯誤有時會在Java程序退出時關閉打開的進程。 在以前的OSX版本上可以正常工作。 但是,ProcessBuilder可在所有OSX版本上使用。

(尚未發布足夠的代表點以使其成為普通評論。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM