2012-08-25 16 views
8

Ho bisogno di costruire il seguente comando utilizzando ProcessBuilder:ProcessBuilder aggiunge citazioni in più per riga di comando

"C:\Program Files\USBDeview\USBDeview.exe" /enable "My USB Device" 

ho provato con il seguente codice:

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(); 

Tuttavia, questo passa il seguente al sistema (verificato utilizzando Sysinternals Process Monitor)

"C:\Program Files\USBDeview\USBDeview.exe" "/enable "My USB Device"" 

Note la quotazione precedente a /enable e le due citazioni dopo lo Device. Ho bisogno di sbarazzarmi di queste citazioni extra perché fanno fallire l'invocazione. Qualcuno sa come fare questo?

+0

Bella osservazione! C'è qualche documento che descrive che ProcessBuilder cita ogni argomento con virgolette doppie? – okwap

risposta

8

Per quanto ho capito, dal momento che ProcessBuilder non ha idea di come passare i parametri al comando, è necessario passare i parametri separatamente a ProcessBuilder;

ArrayList<String> test = new ArrayList<String>(); 
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\""); 
test.add("/enable"); 
test.add("\"My USB Device\""); 
+0

Grazie, Joachim, hai ragione. La ragione per cui sto ricevendo citazioni aggiuntive è lo spazio tra l'abilitazione e "il mio ...". Scacciandolo come supponi lavori. Mentre leggo un comando completo da un file XML, l'analisi ora diventa un po 'più complicata, ma questa è un'altra storia ;-) –

3

In primo luogo, è necessario dividere gli argomenti da soli - ProcessBuilder non lo fa per voi - e in secondo luogo non c'è bisogno di mettere le virgolette attorno sfuggiti i valori degli argomenti.

ArrayList<String> test = new ArrayList<String>(); 
test.add("C:\\Program Files\\USBDeview\\USBDeview.exe"); 
test.add("/enable"); 
test.add("My USB Device"); 

Le virgolette sono necessarie sulla riga di comando per raccontare il parser cmd come spezzare le parole in argomenti, ma ProcessBuilder non ha bisogno di loro perché è già stato dato gli argomenti pre-split.

10

Joachim è corretta, ma la sua risposta è insufficiente quando il processo si aspetta che gli argomenti unificato come di seguito:

myProcess.exe /myParameter="my value" 

Come si vede da Stefan, ProcessBuilder vedrà spazi nel tuo ragionamento e avvolgerlo tra virgolette, in questo modo:

myProcess.exe "/myParameter="my value"" 

rottura i valori dei parametri Joachim raccomanda si tradurrà in uno spazio tra /myparameter= e "my value", che non funzionerà per questo tipo di parametro:

myProcess.exe /myParameter= "my value" 

Secondo Sun, nella loro infinite wisdom, non è un bug e virgolette can be escaped per ottenere il comportamento desiderato.

Quindi, per rispondere finalmente alla domanda di stefan, questa è un'alternativa che dovrebbe funzionare, se il processo che si sta chiamando fa correttamente le cose:

ArrayList<String> test = new ArrayList<String>(); 
test.add("\"C:\\Program Files\\USBDeview\\USBDeview.exe\""); 
test.add("/enable \\\"My USB Device\\\""); 

Questo dovrebbe dare il comando "C:\Program Files\USBDeview\USBDeview.exe" "/enable \"My USB Device\"", che può fare il trucco; YMMV.

+1

hai mai trovato un riferimento ufficiale che afferma che ProcessBuilder "vedrà gli spazi nel tuo argomento e lo avvolgerà con le virgolette" "?Posso confermarlo dai miei test, ma è assurdo che nessun JavaDoc lo abbia mai detto (o almeno nessuno che io abbia potuto trovare). Bella risposta! – mateuscb