36

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

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(動的に変更されるため、ファイルの出力がどうなるかわかりません)。

4

4 に答える 4

51

を使用すると、バックグラウンドでバッチ ファイルを開始する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 によると、コンソール ウィンドウを使用できるようにすることが重要です。これは/wait、@Noofiz の提案に従って、パラメーターを追加することで実行できます。次の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 プロセスは待機します。

于 2013-03-04T10:15:31.310 に答える
7

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

于 2013-03-04T10:19:23.343 に答える
4
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()
于 2016-01-22T14:11:04.733 に答える