![](/img/trans.png)
[英]keytool command successful on command line but not via ProcessBuilder
[英]ProcessBuilder adds extra quotes to command line
我需要使用 ProcessBuilder 構建以下命令:
"C:\Program Files\USBDeview\USBDeview.exe" /enable "My USB Device"
我嘗試使用以下代碼:
ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable \"My USB Device\"");
ProcessBuilder processBuilder = new ProcessBuilder(test);
processBuilder.start().waitFor();
但是,這會將以下內容傳遞給系統(使用 Sysinternals Process Monitor 驗證)
"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device""
注意/enable
之前的引號和Device
之后的兩個引號。 我需要去掉那些額外的引號,因為它們會使調用失敗。 有誰知道如何做到這一點?
Joachim 是正確的,但是當您的過程需要如下統一參數時,他的回答是不夠的:
myProcess.exe /myParameter="my value"
正如 stefan 所見,ProcessBuilder 將在您的參數中看到空格並將其括在引號中,如下所示:
myProcess.exe "/myParameter="my value""
按照 Joachim 的建議/myparameter=
參數值將導致/myparameter=
和"my value"
之間出現空格,這不適用於此類參數:
myProcess.exe /myParameter= "my value"
根據 Sun 的說法,在他們無限的智慧中,這不是錯誤,可以轉義雙引號以實現所需的行為。
因此,為了最終回答 stefan 的問題,如果您正在調用的進程正確執行操作,那么這是一種應該起作用的替代方法:
ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable \\\"My USB Device\\\"");
這應該會給你命令"C:\\Program Files\\USBDeview\\USBDeview.exe" "/enable \\"My USB Device\\""
,這可能會起作用; 天啊。
據我了解,由於 ProcessBuilder 不知道如何將參數傳遞給命令,因此您需要將參數單獨傳遞給 ProcessBuilder;
ArrayList<String> test = new ArrayList<String>();
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\"");
test.add("/enable");
test.add("\"My USB Device\"");
首先,您需要自己拆分參數 - ProcessBuilder
不會為您這樣做 - 其次,您不需要在參數值周圍放置轉義引號。
ArrayList<String> test = new ArrayList<String>();
test.add("C:\\Program Files\\USBDeview\\USBDeview.exe");
test.add("/enable");
test.add("My USB Device");
命令行上的引號是必需的,以便告訴 cmd 解析器如何將單詞分解為參數,但ProcessBuilder
不需要它們,因為它已經預先分配了參數。
我無法以上述任何一種方式使其工作。 我最終將命令寫入一個單獨的腳本(每個空格都帶有“\\”)並將其寫入腳本文件,然后調用腳本文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.