2012-12-12 14 views
6

non penso che questo è possibile, ma ho utilizzato:Input utente alla riga di comando quando si utilizza Runtime.getRuntime(). Exec (comando);

Process p = Runtime.getRuntime().exec(command); 

per eseguire comandi sulla linea di comando, ma ora io sono venuto attraversato una situazione in cui il comando Sono in esecuzione in un punto intermedio chiederà qualche input dell'utente, ad esempio un nome utente.

Questo non può essere risolto da un argomento al comando che si sta eseguendo, esiste un modo per passare il nome utente alla stessa istanza della riga di comando e continuare?

--- EDIT ---

ho ancora cant farlo funzionare. Questi sono i passi sulla linea di comando:

C:\someProgram.exe 
Login: 
Passowrd: 

Quindi ho bisogno di passare il login e la password quando viene richiesto in fase di esecuzione. Il codice che ho ottenuto che non funziona:

try { 
     String CMD = "\"C:\\someProgram\""; 
     Scanner scan = new Scanner(System.in); 
     ProcessBuilder builder = new ProcessBuilder(CMD); 
     builder.redirectErrorStream(true); 
     Process process = builder.start(); 

     InputStream is = process.getInputStream(); 
     BufferedReader reader = new BufferedReader (new InputStreamReader(is)); 
     OutputStream out = process.getOutputStream(); 
     BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); 
     String line; 
     try { 
      while (scan.hasNext()) { 
       String input = scan.nextLine(); 
       if (input.toLowerCase().startsWith("login")) { 
        writer.write("myUsername"); 
       } else if(input.toLowerCase().startsWith("password")){ 
        writer.write("myPassword"); 
       } 
       writer.flush(); 

       line = reader.readLine(); 
       while (line != null) { 
        System.out.println ("Stdout: " + line); 
        line = reader.readLine(); 
       } 
       if (line == null) { 
        break; 
       } 
      } 
      process.waitFor(); 
     } 
     finally {; 
      writer.close(); 
      reader.close(); 
     } 
    } 
    catch (Exception err) { 
     System.err.println("some message"); 
    } 

Ive ha provato cose come: writer.write ("myusername \ n");

Qualsiasi aiuto, posso vedere che alcuniProgram.exe viene chiamato e in esecuzione nei processi, ma semplicemente si blocca.

+0

Hai controllato se 'Processo' ha qualche metodo per farlo? –

+0

Sì, ad esempio Process # getOutputStream() :) – hoaz

risposta

2

Basta scrivere su p.getOutputStream(). Questo invierà il nome utente allo standard input del processo, che dovrebbe fare ciò che vuoi.

out = p.getOutputStream(); 
out.write("fooUsername\n".getBytes()); 
out.flush(); 
0

È necessario reindirizzare il comando di input e inviare i parametri lì. Utilizzare process.setInputStream(), la scrittura in questo flusso.

+1

non c'è process.setInputStream() – hoaz

0

Come parte vostra String command, se si esegue su Unix/Linux/OSX e forse PowerShell, si potrebbe anteporre il comando cat shell per avere il guscio eseguire il dump dei contenuti di un file nel flusso di input per la vostra destinazione eseguibile da leggere come input.

Un comando qualcosa come cat user_input.txt | myAppWantsInput.pl.

Questo avrà il contenuto di user_input.txt, dump in standard-in, in modo che quando "myAppWantsInput.pl" nelle command esegue, e legge da standard a, sarà la lettura del contenuto del file e prendendo che come input come se inserito dalla tastiera.

Ovviamente, non si conosce a priori quali valori si intende passare, è possibile generare dinamicamente i file necessari prima di richiamare il comando. Questo non funzionerà se non è possibile determinare tutto l'input che vorrete prima di eseguire il comando.

+0

Penso che voglia inviare l'input all'istanza Process, non alla Java VM che lo sta eseguendo. – javawizard

+1

@javawizard I per qualche ragione ha assunto che il suo comando fosse l'avvio di un'altra app Java, ho aggiornato la mia risposta per essere più generale. Indipendentemente dall'implementazione dell'eseguibile del comando, il mio approccio dovrebbe funzionare. – ArtB