wake-up-neo.com

Wie führe ich eine Batchdatei aus meiner Java-Anwendung aus?

In meiner Java-Anwendung möchte ich eine Batchdatei ausführen, die "scons -Q implicit-deps-changed build\file_load_type export\file_load_type" aufruft.

Es scheint, dass ich meine Batchdatei nicht zur Ausführung bringen kann. Ich habe keine Ideen mehr. 

Folgendes habe ich in Java:

Runtime.
   getRuntime().
   exec("build.bat", null, new File("."));

Zuvor hatte ich eine Python Sconscript-Datei, die ich ausführen wollte, aber da dies nicht funktionierte, entschied ich mich, das Skript über eine Batchdatei aufzurufen, aber diese Methode war bisher noch nicht erfolgreich. 

100
Amara

Batchdateien sind keine ausführbaren Dateien. Sie benötigen eine Anwendung, um sie auszuführen (d. H. Cmd).

Unter UNIX enthält die Skriptdatei Shebang (#!) Am Anfang einer Datei, um das Programm anzugeben, das sie ausführt. Das Doppelklicken in Windows wird vom Windows Explorer ausgeführt. CreateProcess weiß nichts davon.

Runtime.
   getRuntime().
   exec("cmd /c start \"\" build.bat");

Hinweis: Mit dem Befehl start \"\" wird ein separates Befehlsfenster mit einem leeren Titel geöffnet, und alle Ausgaben der Stapeldatei werden dort angezeigt. Es sollte auch nur mit "cmd/c build.bat" funktionieren. In diesem Fall kann die Ausgabe auf Wunsch aus dem Unterprozess in Java gelesen werden.

162
Paulo Guedes

Manchmal ist die Thread-Ausführungsprozesszeit höher als die JVM-Thread-Warteprozesszeit. Dies geschieht, wenn der Prozess, den Sie aufrufen, einige Zeit zur Verarbeitung benötigt. Verwenden Sie den Befehl waitFor () wie folgt:

try{    
    Process p = Runtime.getRuntime().exec("file location here, don't forget using / instead of \\ to make it interoperable");
    p.waitFor();

}catch( IOException ex ){
    //Validate the case the file can't be accesed (not enought permissions)

}catch( InterruptedException ex ){
    //Validate the case the process is being stopped by some external situation     

}

Auf diese Weise wird die JVM angehalten, bis der Prozess, den Sie aufrufen, abgeschlossen ist, bevor der Thread-Ausführungsstapel fortgesetzt wird.

20
Runtime runtime = Runtime.getRuntime();
try {
    Process p1 = runtime.exec("cmd /c start D:\\temp\\a.bat");
    InputStream is = p1.getInputStream();
    int i = 0;
    while( (i = is.read() ) != -1) {
        System.out.print((char)i);
    }
} catch(IOException ioException) {
    System.out.println(ioException.getMessage() );
}
18
Isha

Batch-Dateien mit Java ausführen, wenn es darum geht, ...

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);`

Das sollte es tun.

13
Abbia

ProcessBuilder ist die Java 5/6-Methode zum Ausführen externer Prozesse.

12
basszero

Die zum Ausführen von Batch-Skripts verwendete ausführbare Datei ist cmd.exe, die den Namen der auszuführenden Batchdatei mit dem Flag /c angibt:

Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "build.bat"});

Theoretisch sollte es auch möglich sein, Scons auf diese Weise auszuführen, obwohl ich dies nicht getestet habe:

Runtime.getRuntime().exec(new String[]{"scons", "-Q", "implicit-deps-changed", "build\file_load_type", "export\file_load_type"});

EDIT: Amara, du sagst, dass das nicht funktioniert. Der von Ihnen aufgelistete Fehler ist der Fehler, den Sie erhalten würden, wenn Sie Java von einem Cygwin-Terminal auf einer Windows-Box ausführen. ist das was du tust Das Problem dabei ist, dass Windows und Cygwin unterschiedliche Pfade haben, sodass die Windows-Version von Java die Scons nicht auf Ihrem Cygwin-Pfad ausführbar findet. Ich kann weiter erklären, ob sich dies als Ihr Problem herausstellt.

10
Eli Courtwright
Process p = Runtime.getRuntime().exec( 
  new String[]{"cmd", "/C", "orgreg.bat"},
  null, 
  new File("D://TEST//home//libs//"));

getestet mit jdk1.5 und jdk1.6

Das funktionierte gut für mich, ich hoffe es hilft auch anderen. Um das zu bekommen, habe ich mehr Tage gekämpft. :(

3
Suren

Ich hatte das gleiche Problem. Manchmal konnte CMD meine Dateien jedoch nicht ausführen. Deshalb erstelle ich auf meinem Desktop eine temporäre.bat. Als nächstes wird diese Datei ausgeführt, und als nächstes wird die temporäre Datei gelöscht.

Ich weiß, dass es sich um einen größeren Code handelt, der jedoch zu 100% für mich funktioniert hat, wenn selbst Runtime.getRuntime (). Exec () fehlgeschlagen ist.

// creating a string for the Userprofile (either C:\Admin or whatever)
String userprofile = System.getenv("USERPROFILE");

BufferedWriter writer = null;
        try {
            //create a temporary file
            File logFile = new File(userprofile+"\\Desktop\\temp.bat");   
            writer = new BufferedWriter(new FileWriter(logFile));

            // Here comes the lines for the batch file!
            // First line is @echo off
            // Next line is the directory of our file
            // Then we open our file in that directory and exit the cmd
            // To seperate each line, please use \r\n
            writer.write("cd %ProgramFiles(x86)%\\SOME_FOLDER \r\nstart xyz.bat \r\nexit");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // Close the writer regardless of what happens...
                writer.close();
            } catch (Exception e) {
            }

        }

        // running our temp.bat file
        Runtime rt = Runtime.getRuntime();
        try {

            Process pr = rt.exec("cmd /c start \"\" \""+userprofile+"\\Desktop\\temp.bat" );
            pr.getOutputStream().close();
        } catch (IOException ex) {
            Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);

        }
        // deleting our temp file
        File databl = new File(userprofile+"\\Desktop\\temp.bat");
        databl.delete();
2
Ben Jost

Folgendes funktioniert gut:

String path="cmd /c start d:\\sample\\sample.bat";
Runtime rn=Runtime.getRuntime();
Process pr=rn.exec(path);
1
bharath

Dieser Code führt zwei Befehle.bat aus, die sich im Pfad C:/Ordner/Ordner befinden.

Runtime.getRuntime().exec("cd C:/folders/folder & call commands.bat");

Um auf @ Isha's Anwser zu erweitern, können Sie einfach Folgendes tun, um die zurückgegebene Ausgabe (post-facto nicht in Echtzeit) des Skripts zu erhalten, das ausgeführt wurde:

try {
    Process process = Runtime.getRuntime().exec("cmd /c start D:\\temp\\a.bat");
    System.out.println(process.getText());
} catch(IOException e) {
    e.printStackTrace();
}
0
NoodleOfDeath