Pregunta

Estoy luchando el error en el método exec espacios de tiempo de ejecución de Java. Esto es lo que es único acerca de este problema: el comando que estoy tratando de ejecutar es una cadena de entrada y puede o no tener espacios y no es necesariamente en cualquier formato específico. De cualquier manera, necesito para ejecutarlo. Si no hay espacios, estoy bien; si hay espacios, no soy tan bueno.

¿Cómo dar cuenta de ambas circunstancias?

Información de Bono sin cargo adicional: Uno de los grandes problemas parece ser que estoy tratando de llamar a un archivo ejecutable en c: \ archivos de programa \ blablabla ... y aparece Exec a dividir en el espacio después de 'c: \programa'. Estoy seguro de que otros temas se acercaba para los parámetros, también.

Este es un ejemplo más específico de los tipos de cadenas que podría obtener. Eso debería aclarar algunas de la confusión:

  • c: \ SomeApp \ someapp.exe
  • c: \ SomeApp \ someapp.exe -someParam = foo
  • c: \ archivos de programa \ SomeApp \ someapp.exe
  • c: \ archivos de programa \ SomeApp \ someapp.exe -someParam = bar

La primera de ellas bien funciona porque no tiene espacios. La segunda es aún bien porque se divide en el espacio y utiliza la primera como una orden y el segundo como un parámetro. El tercer y cuarto ejemplos divididos sobre el primer espacio, el uso de 'C: \ Program'. Y el comando, 'archivos ...' y (en el caso de la cuarta cuerda) '= -someParam bar' como parámetros

¿Fue útil?

Solución 2

Está bien, tengo algo de trabajo por hacer algo como esto. Por favor, dígame si hay un problema con este enfoque:


try{
    String[] command = {"cmd", "/c", getMySuperAwesomeString()};
    Runtime.getRuntime().exec(command);
}catch(IOExecption ioe){
    System.err.println("I'm borken");
}

En una nota relacionada, debería utilizar ProcessBuilder lugar?

Otros consejos

De hecho, me voy a hacer esto una respuesta en lugar de un comentario: (De la J2SE 1,5, Runtime.exec (String []) )

Si se asume que puede preprocesar, utilizar una matriz de cadenas para aliviar los problemas con los espacios en los comandos, la siguiente debería funcionar:

String[] args = {"C:\Program Files\app\app.exe","C:\Data Files\data1.dat"};
Runtime.exec(args);

A partir de ahí depende de ser capaz de averiguar lo que es un espacio entre dos comandos y lo que es un espacio en un camino.

Editar

Esto funcionará si los espacios aparecen en el camino del ejecutable, pero no le ayudará en espacios en los argumentos.

String input = "c:\\program files\\someapp\\someapp.exe -someParam=bar";
int firstSplit = input.indexOf(".exe") + 4; //account for length of ".exe"
String command = input.substring(0,firstSplit);
String args = input.substring(firstSplit).trim(); //trim off extraneous whitespace
String[] argarray = args.split(" ");
String[] cmdargs = new String[argarray.length + 1];
cmdargs[0] = command;
for (int i = 0; i < argarray.length; i++) {
    cmdargs[i+1] = argarray[i];
}
Runtime.exec(cmdargs);

Tenga en cuenta que esto es todavía bastante frágil (y sólo funciona para exe, no bate de o cualquier otra cosa). Si usted necesita para tener en cuenta los espacios en los argumentos, que tendrá que hacer más procesamiento a cualquiera de la cadena o la args argarray. La solución correcta es conseguir que sus usuarios (o el proceso de entrada) para diferenciar adecuadamente todos los argumentos.

Ejemplo para ejecutar un archivo JAR con espacios en la ubicación del archivo:

String qoutation = "\""
String path = "C:\\JAR File\\File.jar"
Runtime.getRuntime().exec("java -jar " + quotation + path + quotation);

Esto ejecuta el comando: java-jar "C: \ archivo JAR \ archivo.jar"

Cuando la barra invertida \ aparece en una cadena que se utiliza como un escape, haciendo del programa de evitarlo. Esto nos permite utilizar las comillas "en la cadena, no para iniciar / cerrar la cadena.

Tal vez estoy pensando demasiado simple, pero podría este trabajo?

Runtime.exec(commandstring.split(" "));

(estoy asumiendo que desea que el comando que se ejecutará como si se ejecuta en una cáscara más o menos.)

Vamos a suponer que puede preprocesar la cadena de entrada. En ese caso, se puede ver si tiene una entrada con espacios con:

if("string with possible spaces".contains(" ")) {
    System.out.println("yay");
}

Tenga en cuenta que esto sólo funcionará si hay un carácter de espacio real en su entrada. Si quieres ser más profunda, asumiendo caracteres de tabulación o saltos de línea son posibles entradas, puede utilizar una expresión regular:

String s = ".+\\s.+";
Pattern p = Pattern.compile(s);

Matcher m = p.matcher("string with possible spaces or    tabs");
if(m.matches()) {
    System.out.println("yay");
}

Editar : Se puede utilizar el código que he proporcionado para detectar si hay espacios en la entrada. Si no los hay, usted no tiene que hacer nada. Si tiene espacios, la situación es un poco más compleja. La lectura de las respuestas de otras personas y su pregunta revisada, sólo puedo asumir que la entrada que tiene espacios que se ha citado, por lo que el espaciamiento no ensuciará la ejecución de comandos estándar. En hay espacios, debe:

  1. comprobar si hay algún cotizaciones en su entrada
  2. si los hay, escapar de ellos (modificar " a \")
  3. envolvente la entrada con comillas (some input convierte "some input")

En última instancia, desea la entrada como para convertirse en some "funky" input "some \"funky\" input".

Nota: tenga cuidado con comillas simples ('). Tratar con ellos adecuadamente.

Estoy asumiendo que este es el error que está luchando:

http://bugs.sun.com/bugdatabase/view_bug.do? bug_id = 4506936

http://bugs.sun.com/bugdatabase/ view_bug.do;? jsessionid = 8582245ba20fa4da33ac0967e858 bug_id = 4491217

Se dice que la solución sería:

Usar un JRE que no se encuentra en una ruta que contiene espacios.

Uso Proceso ejecutivo pública (String [cmdarray],                     String [] envp)              throws IOException

y poner el comando y los parámetros en una matriz separada. De esta manera no se trataría de tockenize y utilizar el espacio como separador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top