簡體   English   中英

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.

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