Frage

In meiner Java-Anwendung, ich möchte eine Batch-Datei auszuführen, die "scons -Q implicit-deps-changed build\file_load_type export\file_load_type" nennt

Es scheint, dass ich nicht einmal meine Batch-Datei bekommen kann auszuführen. Ich bin aus Ideen.

Das ist, was ich habe in Java:

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

Früher hatte ich eine Python Sconscript Datei, die ich ausführen wollte, aber da das nicht funktionierte entschied ich würde das Skript über eine Batch-Datei aufrufen, aber das Verfahren hat sich als der noch nicht erfolgreich gewesen.

War es hilfreich?

Lösung

Batch-Dateien sind keine ausführbare. Sie brauchen eine Anwendung, um sie auszuführen (das heißt cmd).

Unter UNIX die Skriptdatei hat shebang (#!) Am Anfang einer Datei das Programm angeben, die es ausführt. Ein Doppelklick in Windows wird von Windows Explorer ausgeführt. CreateProcess weiß nichts darüber.

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

Hinweis: Mit dem start \"\" Befehl wird ein separates Befehlsfenster mit einem leeren Titel und jede Ausgabe von der Batch-Datei dort angezeigt wird geöffnet werden. Es sollte auch mit nur `cmd / c build.bat“, wobei in diesem Fall die Ausgabe von dem Sub-Prozess in Java lesen kann funktionieren, wenn gewünscht.

Andere Tipps

Manchmal ist der Thread-Ausführung Prozesszeit höher als JVM-Thread-Prozess Wartezeit, es passieren verwenden, wenn der Prozess Sie aufrufen einige Zeit dauert, verarbeitet werden, die waitFor () Befehl 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 die JVM stoppen, bis der Prozess Sie den Aufruf gemacht wird, bevor es mit dem Thread-Ausführungsstapel fortgesetzt werden.

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() );
}

Um Batch-Dateien mit Java laufen, wenn das ist, Sie sprechen über ...

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

Das sollte es tun.

Process ist die Java 5 / 6 Wege, um externe Prozesse ausgeführt werden.

Die ausführbare Datei verwendet, um Batch-Skripte ausgeführt ist cmd.exe die die /c Flagge verwendet den Namen der Batchdatei angeben auszuführen:

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

Theoretisch sollten Sie auch in der Lage sein Scons auf diese Weise zu laufen, obwohl ich nicht getestet haben:

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

EDIT: Amara, Sie sagen, dass dies nicht funktioniert. Der Fehler, den Sie aufgelistet ist der Fehler, den Sie bekommen würde, wenn Java von einem Cygwin-Terminal auf einem Windows-Box läuft; ist es das, was du tust? Das Problem mit diesem ist, dass Windows und Cygwin verschiedene Pfade haben, so dass die Windows-Version von Java wird nicht die scons ausführbare Datei auf Ihrem Cygwin Weg finden. Ich kann weiter erklären, wenn diese stellt sich heraus, um Ihr Problem zu sein.

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, hoffe, es anderen zu helfen. dies bekomme ich mehr Tage zu kämpfen haben. : (

Ich hatte das gleiche Problem. Doch manchmal versagt CMD meine Dateien laufen. Deshalb habe ich eine temp.bat auf meinem Desktop zu erstellen, neben dieser temp.bat wird meine Datei auszuführen, und neben der temporäre Datei wird gelöscht werden.

Ich weiß, dass dies eine größere Code ist jedoch für mich gearbeitet in 100%, wenn auch Runtime.getRuntime (). Exec () ist fehlgeschlagen.

// 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();

Die folgenden funktioniert gut:

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

Dieser Code wird zwei commands.bat ausführen, die in dem Pfad C existieren. / Ordner / Ordner

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

@ Isha des anwser zu erweitern nur Folgendes tun könnte die zurückgegebenen Ausgabe (post-facto bekommen nicht in rea-LTIME) des Skripts, 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();
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top