2011-01-14 17 views
35

¿Es posible abrir el símbolo del sistema (y supongo que cualquier otro terminal para otros sistemas) y ejecutar comandos en la ventana recién abierta?¿Cómo abrir el símbolo del sistema e insertar comandos usando Java?

Actualmente lo que tengo es la siguiente:

Runtime rt = Runtime.getRuntime(); 
rt.exec(new String[]{"cmd.exe","/c","start"}); 

He intentado añadir el siguiente comando después del "inicio", he intentado funcionar otra rt.exec que contiene mi mando, pero no puedo encuentra una manera de hacerlo funcionar

si importa, estoy tratando de ejecutar un comando similar al siguiente:

java -flag -flag -cp terminal-based-program.jar 

EDITAR Por desgracia he tenido algunos resultados extraños. Pude lanzar con éxito el símbolo del sistema y pasar un comando usando esto:

rt.exec("cmd.exe /c start command"); 

Sin embargo, parece que solo funciona con un comando. Porque, si trato de usar el separador de comandos de esta manera, "comando cmd.exe/c start & command2", el segundo comando se pasa por el fondo (de la misma manera que si usara rt.exec ("command2") ;). Ahora el problema aquí es que me di cuenta de que necesito cambiar el directorio en el que se ejecuta el símbolo del sistema, porque si solo uso la ruta completa al archivo jar, el archivo jar lee incorrectamente los datos del directorio activo del símbolo del sistema, no el directorio del jar que contiene sus recursos.

+1

Podría aclarar por qué está tratando de hacer esto en lugar de simplemente ejecutar .exec en el comando java. La ventana de comando se abrirá automáticamente. –

+0

Ver el comentario que puse en la respuesta de ktm5124. –

Respuesta

20

Sé que la gente recomienda mantenerse alejado de rt.exec (String), pero esto funciona, y no sé cómo cambiarlo a la versión del arreglo.

rt.exec("cmd.exe /c cd \""+new_dir+"\" & start cmd.exe /k \"java -flag -flag -cp terminal-based-program.jar\""); 
+0

Estoy trabajando para hacer algo similar a lo que eres, y tengo curiosidad de dónde vienen los/c y/k. Parece que no puedo encontrar una mención de ellos para cmd. Además, ¿por qué está escapando comillas? ¿Es porque los valores intermedios representan un comando para pasar a CMD? – Ungeheuer

+2

'cmd /?' '/ C Realiza el comando especificado por la cadena y luego finaliza /K Realiza el comando especificado por la cadena pero permanece' –

3

las siguientes obras para mí en Snow Leopard:

Runtime rt = Runtime.getRuntime(); 
String[] testArgs = {"touch", "TEST"}; 
rt.exec(testArgs); 

cosa es, si quieres leer la salida de ese comando, es necesario que lea el flujo de entrada del proceso. Por ejemplo,

Process pr = rt.exec(arguments); 
BufferedReader r = new BufferedReader(new InputStreamReader(pr.getInputStream())); 

Le permite leer la salida línea por línea del comando con bastante facilidad.

El problema también podría ser que MS-DOS no interpreta su orden de argumentos para significar "iniciar un nuevo símbolo del sistema". Su gama probablemente debería ser:

{ "start", "cmd.exe", "\ c"}

Para abrir comandos en el nuevo símbolo del sistema, que tendría que utilizar la referencia de proceso. Pero no estoy seguro de por qué querría hacer eso cuando puede simplemente usar el ejecutivo, como comentó la persona que me precedió.

+0

El motivo por el que quiero abrir comandos en el nuevo símbolo del sistema es porque el programa que intento iniciar es un programa basado en la consola con su entrada y salida provenientes de la consola y yendo a ella, respectivamente. Tenga en cuenta que el programa que estoy tratando de lanzar no es uno que hice, así que tengo que programar en función de cómo funciona, no puedo cambiarlo. –

6

Si está ejecutando dos comandos a la vez sólo para cambiar el directorio de la línea de comandos se ejecuta en, hay una sobrecarga para el método Runtime.exec que le permite especificar el directorio de trabajo actual. Como,

Runtime rt = Runtime.getRuntime(); 
rt.exec("cmd.exe /c start command", null, new File(newDir)); 

Esto abrirá el símbolo del sistema en el directorio en newDir. Creo que tu solución también funciona, pero esto mantiene tu cadena de comandos o matriz un poco más limpia.

Hay una sobrecarga por tener el comando como una cadena y tener el comando como una matriz de Cadenas.

Puede que le resulte aún más fácil usar el ProcessBuilder, que tiene un método directory para establecer su directorio de trabajo actual.

Espero que esto ayude.

+0

debe ser runtime.exec (" cmd.exe/c start " , null, new File (newDir)); – ChanGan

+1

Lo he usado, String newDir = "C: \\ Test \\ Application \\"; runtime.exec ("cmd.exe/c start dir", nulo, nuevo archivo (newDir)); en esta carpeta si quiero ejecutar algún comando, C: \ Test \ Application \ avt install - filename ... ¿cómo hacer esto? Me puedes ayudar con esto ?? – ChanGan

8
public static void main(String[] args) { 
    String[] arg = new String[]{"-u root", "-h localhost"}; 

    try { 
     String ss = null; 
     Runtime obj = null; 
     Process p = Runtime.getRuntime().exec("cmd.exe /c start dir "); 
     BufferedWriter writeer = new BufferedWriter(new OutputStreamWriter(p.getOutputStream())); 
     writeer.write("dir"); 
     writeer.flush(); 
     BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream())); 
     System.out.println("Here is the standard output of the command:\n"); 
     while ((ss = stdInput.readLine()) != null) { 
      System.out.println(ss); 
     } 
     System.out.println("Here is the standard error of the command (if any):\n"); 
     while ((ss = stdError.readLine()) != null) { 
      System.out.println(ss); 
     } 

    } catch (IOException e) { 
     System.out.println("FROM CATCH" + e.toString()); 
    } 

} 
+7

Puede eliminar comentarios irrelevantes de su código y agregar algunos relevantes. –

1

Simplemente agregue su comando después del inicio en la cadena que está pasando.

String command = "cmd.exe/c start" + "su comando";

Proceso child = Runtime.getRuntime(). Exec (comando);

0

Coloque su comando en un parámetro como se menciona a continuación.

Runtime.getRuntime(). Exec ("cmd.exe/c start cmd/k \" parameter \ "");

Cuestiones relacionadas