2010-07-18 15 views
5

Ich wollte eine .cmd-Datei von Java ausführen. Ich habe etwas, was für mich funktioniert. Kann mir jemand helfen, mögliche Fehler meines Programms zu verstehen?Ausführen einer .bat/.cmd-Datei von Java

import java.io.IOException; 

/* 
    How to run a batch .bat or .cmd file from Java? 
    1. I don't want the command window to open up. It should be in background. 
    2. Gracefully destroy any new process created. 
    3. Need to confirm the quality of the program with experts. 
*/ 
public class RunBat { 
    public static void main(String args[]) { 
     Runtime run = Runtime.getRuntime(); 
     //The best possible I found is to construct a command which you want to execute 
     //as a string and use that in exec. If the batch file takes command line arguments 
     //the command can be constructed a array of strings and pass the array as input to 
     //the exec method. The command can also be passed externally as input to the method. 

     Process p = null; 
     String cmd = "D:\\Database\\TableToCSV.cmd"; 
     try { 
      p = run.exec(cmd); 
      p.getErrorStream(); 
      System.out.println("RUN.COMPLETED.SUCCESSFULLY"); 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
      System.out.println("ERROR.RUNNING.CMD"); 
      p.destroy(); 
     } 
    } 
} 

Ist meine Lösung zuverlässig? Wie kann ich sicherstellen, dass, sobald die .cmd ausgeführt wird, keine Prozesse hängen bleiben.

Danke.

Antwort

4

Ich weiß nicht, was Sie mit p.getErrorStream tun(), Du accesing es nicht .

Way Ergebnis d.h. Beendigungscode des Befehls, um zu bestimmen durch Addieren folgende Zeilen ausgeführt wird, nachdem

p = run.exec(cmd); 
p.waitFor(); 
System.out.println(p.exitValue()); 

und PUT p.destroy() in schließlich zu blockieren.

Hoffe, das hilft.

+0

Ich dachte, ich die Fehler sammeln kann, wenn eine von p.getErrorStream(), das habe ich nicht vervollständigen Teil des Codes. p.waitFor(), ah, mein Schlechter, dies ist eines der Dinge, die ich wollte, um zu wissen, ob der Prozess abgeschlossen ist, Ergebnis der nicht die Java Doc. Ich werde einen finally-Block für p.destroy() erstellen. Danke für Ihre Zeit. – dRv

+0

Ihr Kommentar deutet darauf hin, dass meine Antwort zufriedenstellend ist. Kannst du es als Antwort akzeptieren? – YoK

3

Führen Sie Ihren Befehl wie:

cmd.exe /C d:\database\tabletoCSV.cmd 

cmd.exe /? für weitere Informationen:

> cmd /? 
Starts a new instance of the Windows command interpreter 

CMD [/A | /U] [/Q] [/D] [/E:ON | /E:OFF] [/F:ON | /F:OFF] [/V:ON | /V:OFF] 
    [[/S] [/C | /K] string] 

/C  Carries out the command specified by string and then terminates 
/K  Carries out the command specified by string but remains 
[...] 
0

Es gibt eine andere Sache, die mit diesem Code falsch ist, die andere Antworten nicht anzeigen: Wenn der Prozess, den Sie starten, generiert (Konsole) Ausgabe und Sie seinen Ausgangsstrom nicht verbinden, wird es anhalten und ohne ersichtlichen Grund fehlschlagen. Für einige Programme und Umgebungen habe ich gefunden, dass es notwendig ist, separate Threads zu verbinden, um sowohl die Ausgabe- als auch die Fehlerströme leer zu halten. Und um ihre Leistung zu erfassen, fliegen Sie nicht blind.

Wenn Sie ein modernes Java (Post 1.5) haben, könnten Sie auch die ProcessBuilder Klasse als Mittel zum Starten von externen Programmen betrachten.

1

Wie Carl erwähnt nur

  • Sie keine Ausgabe Fehler/Erfolg Ausgang zu erfassen.
  • Sie lassen den Prozess Thread nicht auf exitValue warten.
  • Haben Sie sich die ProcessBuilder-Klasse angesehen?

Wie auch immer, können Sie sich auch an folgenden Code

Process proc = null; 
    Runtime rt = Runtime.getRuntime(); 
    try { 
     proc = rt.exec(cmd); 
     InputStream outCmdStream = proc.getInputStream(); 
     InputStreamReader outCmdReader = new InputStreamReader(outCmdStream); 
     BufferedReader outCmdBufReader = new BufferedReader(outCmdReader); 
     String outLine; 
     while ((outLine = outCmdBufReader.readLine()) != null) { 
      System.out.println(outLine); 
     } 
     InputStream errStream = proc.getErrorStream(); 
     InputStreamReader errReader = new InputStreamReader(errStream); 
     BufferedReader errBufReader = new BufferedReader(errReader); 
     String errLine; 
     while ((errLine = errBufReader.readLine()) != null) { 
      System.out.println(errLine); 
     } 
     int exitVal = proc.waitFor(); 
     System.out.println("Process exitValue: " + exitVal); 

    } catch (IOException e) { 
     e.printStackTrace(); 
     System.out.println("ERROR.RUNNING.CMD"); 
     proc.destroy(); 
    } 
} 

hoffe, das hilft

+0

Vielen Dank. Es hat mir geholfen zu verstehen. – dRv