2010-02-04 10 views
7

Ich versuche, die Ergebnisse eines Befehls cmd (Dir zum Beispiel) einzulesen. Nach dem Erstellen des Prozesses verwende ich eine BufferedReader in Verbindung mit einer InputStreamReader. Aus irgendeinem Grund bleibt die BufferedReader leer, obwohl ich weiß, dass es einige Ausgaben zum Lesen geben muss. HierProblem mit der Ausgabe eines Befehls cmd in Java

ist der Code Ich verwende:

String[] str = new String[] {"cmd.exe", "/c", 
      "cd", "c:\\", 
      "dir", "/b", "/s"    
    }; 
    Runtime rt = Runtime.getRuntime(); 
    try{ 

     Process p = rt.exec(str); 
     InputStream is =p.getInputStream(); 
     System.out.println(is.available()); 
     InputStreamReader in = new InputStreamReader(is); 

     StringBuffer sb = new StringBuffer(); 
     BufferedReader buff = new BufferedReader(in); 
     String line = buff.readLine(); 
     System.out.println(line); 
     while(line != null) 
     { 
      sb.append(line + "\n"); 
     System.out.println(line); 
      line = buff.readLine(); 
     } 
     System.out.println(sb); 
     if (sb.length() != 0){ 
      File f = new File("test.txt"); 
      FileOutputStream fos = new FileOutputStream(f); 
      fos.write(sb.toString().getBytes()); 

      fos.close(); 
     } 
    }catch(Exception ex) 
    { 
     ex.printStackTrace(); 
    } 
+0

ist process.getErrorStream() auch leer? –

+0

ja - sowohl der ErrorStream als auch der InputStream haben 0 Bytes zur Verfügung – chama

+0

Ich habe es gerade noch einmal ausgeführt, und der Fehler-Stream ist nicht leer. Als ich den Fehlerstrom las, druckte es "Das System kann den angegebenen Pfad nicht finden", was nicht gerade Sinn macht, aber zumindest ist es etwas. – chama

Antwort

5

Sie haben:

String[] str = new String[] {"cmd.exe", "/c", 
      "cd", "c:\\", 
      "dir", "/b", "/s"    
    }; 

die mir scheint nicht richtig. Sie können nicht mehrere Befehle in cmd.exe in einer Befehlszeile eingeben. Das ist eine Batch-Datei.

Versuchen Sie, alles loszuwerden, entweder die CD oder das Verzeichnis.

edit: in der Tat:

C:\>cmd.exe /c cd c:\ dir 
The system cannot find the path specified. 
+0

Das hat das Problem gelöst! Ich habe ein "&" zwischen dem Befehl cd und dem Befehl dir gesetzt und die richtige Ausgabe erhalten! – chama

+2

@chama: Was ist mit einfach 'dir/b/s C: \'? Nur zum Spaß: Versuchen Sie, Ihren Code von einem anderen Laufwerk wie 'D:' auszuführen. Ihr 'cd' Befehl würde dort nichts tun. Verwenden Sie im Allgemeinen alles, was anwendbar ist, und versuchen Sie nicht, die Dinge zu komplizieren. Dies ist ein Beispiel, in dem Sie genau einen Befehl benötigen, der Ihren Wünschen entspricht. Diese Sequenz von zwei wird nicht. – Joey

1

Es könnte ein Fehler sein. In diesem Fall sollten Sie auch Trap getErrorStream()

+0

Ich habe versucht, den ErrorStream abzufangen und bekam "Das System kann den angegebenen Pfad nicht finden." Aber wie kann es c: \ nicht finden? – chama

1

Der Befehl, den Sie laufen ist cmd.exe /c cd c:\ dir /b /s. Ich glaube nicht, dass das tut, was Sie erwarten.


Ich meine, dass Sie zwei Befehle in einer Zeile und die Windows-Shell wahrscheinlich verkettet haben nicht so. Probieren Sie etwas wie

String[] str = new String[] {"cmd.exe", "/c", 
      "cd", "c:\\", "&&", 
      "dir", "/b", "/s"    
    }; 

Die && wird die Shell sagen zu cd c:\ ausführen und dann dir /b /s auszuführen, wenn der erste Befehl erfolgreich war.

+0

das ist ein sehr guter Punkt. Ich suchte ursprünglich nach einer bestimmten Datei in diesem Ordner. Leider hat das Herausnehmen der/s das Problem nicht gelöst – chama

Verwandte Themen