2012-08-25 10 views
8

que necesito para construir el siguiente comando usando ProcessBuilder:ProcessBuilder agrega cotizaciones adicionales a la línea de comandos

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

he intentado con el siguiente código:

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

Sin embargo, este pasa a la siguiente para el sistema (verificado mediante Sysinternals Process monitor)

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

nota la cita antes /enable y las dos citas después de Device. Necesito deshacerme de esas comillas adicionales porque hacen que falle la invocación. ¿Alguien sabe como hacer esto?

+0

¡Bonita observación! ¿Hay algún documento que describa que ProcessBuilder cita cada argumento con comillas dobles? – okwap

Respuesta

8

Por lo que tengo entendido, dado que ProcessBuilder no tiene idea de cómo se deben pasar los parámetros al comando, deberá pasar los parámetros por separado 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

Gracias Joachim, tienes razón. La razón por la que recibo cotizaciones adicionales es el espacio entre enable y "my ...". Dividirlo como supones que funciona. Mientras leo un comando completo de un archivo XML, el análisis ahora se vuelve un poco más complicado, pero esa es otra historia ;-) –

3

En primer lugar, es necesario dividir los argumentos sí mismo - ProcessBuilder no hace eso para usted - y en segundo lugar que no es necesario poner comillas escapado en torno a los valores de los argumentos.

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

Las comillas son necesarias en la línea de comandos con el fin de comunicar al analizador cmd cómo dividir las palabras en argumentos, pero ProcessBuilder no los necesita porque ya se le ha dado los argumentos pre-split.

10

Joachim es correcta, pero su respuesta es insuficiente cuando el proceso de espera que unificó los argumentos de la siguiente manera:

myProcess.exe /myParameter="my value" 

Como se ve por Stefan, ProcessBuilder verá espacios en su argumento y se envuelve entre comillas, así:

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

Romper los valores de parámetros como Joachim recomienda resultará en un espacio entre /myparameter= y "my value", que no va a funcionar para este tipo de parámetro:

myProcess.exe /myParameter= "my value" 

De acuerdo con Sun, en su infinite wisdom, no es un error y comillas dobles can be escaped para lograr el comportamiento deseado.

Así que para responder finalmente a la pregunta de Stefan, esta es una alternativa que debería funcionar, si el proceso que está llamando hace las cosas correctamente:

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

Esto debe darle el comando "C:\Program Files\USBDeview\USBDeview.exe" "/enable \"My USB Device\"", lo que puede hacer el truco; YMMV.

+1

¿Alguna vez ha encontrado una referencia oficial que dice que ProcessBuilder "verá espacios en su argumento y lo incluirá con comillas? "¿?"Puedo confirmarlo por mis pruebas, pero es una locura que JavaDoc nunca lo afirme (o al menos ninguno que yo pueda encontrar). ¡Buena respuesta! – mateuscb

Cuestiones relacionadas