2011-01-14 22 views
35

È possibile aprire il prompt dei comandi (e credo che qualsiasi altro terminale per altri sistemi) ed eseguire i comandi nella finestra appena aperta?Come aprire il prompt dei comandi e inserire i comandi utilizzando Java?

Attualmente Quello che ho è questa:

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

Ho provato ad aggiungere il comando successivo dopo la "start", ho provato a fare funzionare un altro rt.exec contenente il mio comando, ma non ci riesco trova un modo per farlo funzionare.

Se è importante, sto cercando di eseguire un comando simile a questo:

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

EDIT Purtroppo ho avuto alcuni strani risultati. Sono stato in grado di avviare correttamente il prompt dei comandi e passare un comando utilizzando questo:

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

Tuttavia, sembra funzionare solo con un comando. Perché, se provo a usare il separatore di comando come questo, "cmd.exe/c start command & command2", il secondo comando viene passato attraverso lo sfondo (come se avessi usato rt.exec ("command2") ;). Ora il problema è che mi sono reso conto che ho bisogno di cambiare la directory in cui è in esecuzione il prompt dei comandi, perché se utilizzo semplicemente il percorso completo del file jar, il file jar legge erroneamente i dati dalla directory attiva del prompt dei comandi, non la directory del jar che contiene le sue risorse.

+1

Potrebbe chiarire il motivo per cui si sta tentando di farlo anziché eseguire appena .exec sul comando java. La finestra di comando si aprirà automaticamente. –

+0

Vedere il commento che ho inserito nella risposta di ktm5124. –

risposta

20

So che le persone consigliano di stare lontano da rt.exec (String), ma questo funziona e non so come modificarlo nella versione dell'array.

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

Sto lavorando per fare qualcosa di simile a quello che sei, e sono curioso da dove vengono/c e/k. Non riesco a trovare di averne parlato per cmd. Inoltre, perché stai sfuggendo alle virgolette? È perché i valori intermedi rappresentano un comando da passare a CMD? – Ungeheuer

+2

'cmd /?' ' /C Esegue il comando specificato dalla stringa e quindi termina /K Esegue il comando specificato dalla stringa, ma remains' –

3

le seguenti opere per me su Snow Leopard:

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

cosa è, se si vuole leggere l'output di questo comando, è necessario leggere il flusso di input del processo. Ad esempio,

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

Consente di leggere l'output riga per riga del comando abbastanza facilmente.

Il problema potrebbe anche essere che MS-DOS non interpreta l'ordine degli argomenti come "avvia un nuovo prompt dei comandi". L'array dovrebbe probabilmente essere:

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

Per aprire comandi del nuovo prompt dei comandi, che avrebbe dovuto utilizzare il riferimento di processo. Ma non sono sicuro del perché vorresti farlo quando puoi semplicemente usare exec, come la persona prima di me ha commentato.

+0

Il motivo per cui voglio aprire i comandi nel nuovo prompt dei comandi è perché il programma che sto tentando di avviare è un programma basato su console con i suoi input e output che provengono rispettivamente dalla console e dalla console. Nota, il programma che sto tentando di avviare non è uno che ho creato, quindi devo programmare in base a come funziona, non posso cambiarlo. –

6

Se si esegue due comandi in una volta solo per cambiare la directory del prompt dei comandi viene eseguito in, c'è un sovraccarico per il metodo Runtime.exec che consente di specificare la directory di lavoro corrente. Mi piace,

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

Si aprirà il prompt dei comandi nella directory su newDir. Penso che la tua soluzione funzioni bene, ma questo mantiene la tua stringa di comando o array un po 'più pulito.

C'è un sovraccarico per avere il comando come stringa e avere il comando come array di stringhe.

Potreste trovare ancora più semplice, tuttavia, utilizzare ProcessBuilder, che ha un metodo directory per impostare la directory di lavoro corrente.

Spero che questo aiuti.

+0

dovrebbe essere Runtime.exec ("cmd.exe/c start" , null, new File (newDir)); – ChanGan

+1

Ho usato questo, String newDir = "C: \\ Test \\ Applicazione \\"; runtime.exec ("cmd.exe/c start dir", null, new File (newDir)); sotto questa cartella se voglio eseguire qualche comando, C: \ Test \ Application \ avt install - filename .. come si fa ?? Puoi aiutarmi su questo ?? – 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

È possibile rimuovere i commenti non pertinenti dal codice e aggiungerne di pertinenti. –

1

Basta aggiungere il comando dopo l'avvio nella stringa che stai passando.

Comando stringa = "cmd.exe/c start" + "il comando";

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

0

Inserire il comando in un parametro come indicato di seguito.

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