2013-06-12 18 views
6

Sto cercando di eseguire un file .bat e ottenere l'output. Posso correre, ma non riesco a ottenere i risultati in Java:Ottieni l'output dal file BAT utilizzando Java

String cmd = "cmd /c start C:\\workspace\\temp.bat"; 

Runtime r = Runtime.getRuntime(); 
Process pr = r.exec(cmd); 

BufferedReader stdInput = new BufferedReader(
    new InputStreamReader(pr.getInputStream())); 

String s ; 
while ((s = stdInput.readLine()) != null) { 
    System.out.println(s); 
} 

Il risultato è null. Non ho idea del motivo per cui ho capito. Si noti che sto usando Windows 7.

+0

Leggere (e implementare) * tutte * le raccomandazioni di [Quando Runtime.exec() non lo farà] (http://www.javaworld.com/jw-12-2000/jw-1229-traps.html) . Questo potrebbe risolvere il problema. In caso contrario, dovrebbe fornire maggiori informazioni sul motivo per cui ha fallito. Quindi ignora che si riferisce a 'exec' e costruisce il' Processo' usando un 'ProcessBuilder'. Rompa anche un 'String arg' in' String [] args' per tenere conto degli argomenti che contengono spazi. –

risposta

4

Utilizzando "cmd/c avviare [...] "per eseguire un file batch creerà un processo secondario invece di eseguire direttamente il file batch.

Pertanto, non si avrà accesso alla sua uscita. Per farlo funzionare, è necessario utilizzare:

String cmd = "C:\\workspace\\temp.bat"; 

Funziona con Windows XP.

+0

questo risolto ho un altro problema che il file bat contiene inizio run.bat comando e ho bisogno l'altro risultato troppo :( – Muath

+1

È possibile utilizzare ** ** CALL per eseguire un altro file batch all'interno del vostro primario script.Vedi [link] (http://www.robvanderwoude.com/call.php) e [link] (http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en- us/call.mspx? mfr = true) per riferimenti. –

3

È necessario avviare un nuovo thread in grado di leggere il flusso di output del terminale e copiarlo nella console, dopo aver chiamato process.waitFor().

fare qualcosa di simile:

String line; 
Process p = Runtime.getRuntime().exec(...); 
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
while ((line = input.readLine()) != null) { 
    System.out.println(line); 
} 
input.close(); 

Meglio approccio sarà quello di utilizzare la classe ProcessBuilder, e provare a scrivere qualcosa di simile:

ProcessBuilder builder = new ProcessBuilder("/bin/bash"); 
builder.redirectInput(); 
Process process = builder.start(); 

while ((line = reader.readLine()) != null) { 
    System.out.println ("Stdout: " + line); 
} 
+0

amico che ho provato questo non ha funzionato Sto diventando valore nullo invece del risultato del comando – Muath

+0

nel ProcessBuilder non c'è .redirectInput(); metodo qualche suggerimento? utilizzo NetBeans BTW – Muath

-1
BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getErrorStream())); 

invece utilizzare

BufferedReader stdInput = new BufferedReader(new 
InputStreamReader(pr.getInputStream)); 
+0

Non ignorare il flusso di errori. Per un codice robusto, entrambi devono essere consumati. –

+0

per entrambi i loop while richiesti separatamente –

+0

Questo in realtà non risponde alla domanda. –

Problemi correlati