web-dev-qa-db-ja.com

Runtime.exec()。waitFor()は、プロセスが完了するまで待機しません

私はこのコードを持っています:

File file = new File(path + "\\RunFromCode.bat");
file.createNewFile();

PrintWriter writer = new PrintWriter(file, "UTF-8");
for (int i = 0; i <= MAX; i++) {
    writer.println("@cd " + i);
    writer.println(NATIVE SYSTEM COMMANDS);
    // more things
}

writer.close();

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");
p.waitFor();

file.delete();

実際に実行される前にファイルが削除されます。

これは、.batファイルにネイティブシステムコールのみが含まれているためですか?削除を行うにはどうすればよいですか.batファイルの実行ですか? (動的に変化するため、.batファイルの出力がどうなるかわかりません)。

29
Maroun

startを使用すると、バックグラウンドでバッチファイルを開始するように求められます_cmd.exe_:

_Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");
_

したがって、Java(_cmd.exe_)から起動したプロセスは、バックグラウンドプロセスが終了する前に戻ります。

startコマンドを削除して、フォアグラウンドでバッチファイルを実行します。その後、waitFor()はバッチファイルの完了を待ちます。

_Process p = Runtime.getRuntime().exec("cmd /c " + path + "\\RunFromCode.bat");
_

OPによると、コンソールウィンドウを使用可能にすることが重要です。これは、@ Noofizが示唆するように、_/wait_パラメーターを追加することで実行できます。次のSSCCEは私のために働いた:

_public class Command {

public static void main(String[] args) throws Java.io.IOException, InterruptedException {
       String path = "C:\\Users\\andreas";

       Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "\\RunFromCode.bat");

       System.out.println("Waiting for batch file ...");
       p.waitFor();
       System.out.println("Batch file done.");
   }
}
_

_RunFromCode.bat_がEXITコマンドを実行すると、コマンドウィンドウが自動的に閉じられます。それ以外の場合、コマンドウィンドウは、EXITで明示的に終了するまで開いたままになります。いずれの場合も、ウィンドウが閉じるまでJavaプロセスは待機しています。

47
Andreas Fester

startコマンドの前に/waitパラメーターを追加してみてください。

5
Mikhail
waitForProcessOutput()

私たちのためにトリックをしました。

見る:

http://docs.groovy-lang.org/docs/groovy-1.7.2/html/groovy-jdk/Java/lang/Process.html#waitForProcessOutput()

コード例(SOAPUIで使用)

def process = "Java -jar ext\\selenese-runner.jar".execute()

process.waitForProcessOutput()

def exitValue = process.exitValue()
3
Michel

解答として注釈マークで説明されているコードはいずれも解決策ではありません。

最初の答え

Process p = Runtime.getRuntime().exec("cmd /c start " + path + "\\RunFromCode.bat");

第二の答え

Process p = Runtime.getRuntime().exec("cmd /c " + path + "\\RunFromCode.bat");

第三の答え

public class Command {

public static void main(String[] args) throws Java.io.IOException, InterruptedException {
       String path = "C:\\Users\\andreas";

       Process p = Runtime.getRuntime().exec("cmd /c start /wait " + path + "\\RunFromCode.bat");

       System.out.println("Waiting for batch file ...");
       p.waitFor();
       System.out.println("Batch file done.");
   }
}