web-dev-qa-db-ja.com

Javaの1つのcmdウィンドウで複数のコマンドを実行するにはどうすればよいですか?

私がやりたいのは、Javaアプリケーションからbatchファイルを複数回実行することです。したがって、for-loopこのコードをn回実行します:

for (int i = 0; i < n; i++) {
    Runtime.getRuntime().exec("cmd /c start somefile.bat");
}

問題は、コマンドが実行されるたびに新しいcmdウィンドウがポップアップすることです。ただし、必要なのは、最初にポップアップするoneウィンドウだけで、次のコマンド呼び出しからのすべてのデータを表示するために使用されます。

どうやってやるの?

13
user2426316

&&を使用すると、複数のコマンドを次々に実行できます。

Runtime.getRuntime().exec("cmd /c \"start somefile.bat && start other.bat && cd C:\\test && test.exe\"");

複数のコマンドと条件付き処理シンボルの使用

条件付き処理シンボルを使用して、単一のコマンドラインまたはスクリプトから複数のコマンドを実行できます。条件付き処理シンボルを使用して複数のコマンドを実行すると、条件付き処理シンボルの右側にあるコマンドは、条件付き処理シンボルの左側にあるコマンドの結果に基づいて動作します。

たとえば、前のコマンドが失敗した場合にのみコマンドを実行することができます。または、前のコマンドが成功した場合にのみコマンドを実行することもできます。次の表に示す特殊文字を使用して、複数のコマンドを渡すことができます。

& [...] command1 & command2
1つのコマンドラインで複数のコマンドを区切るために使用します。 Cmd.exeは最初のコマンドを実行し、次に2番目のコマンドを実行します。

&& [...] command1 && command2
シンボルの前のコマンドが成功した場合にのみ、&&の後にコマンドを実行するために使用します。 Cmd.exeは最初のコマンドを実行し、最初のコマンドが正常に完了した場合にのみ2番目のコマンドを実行します。

|| [...] command1 || command2
次のコマンドを実行するために使用します|| ||の前にあるコマンドのみ失敗します。 Cmd.exeは最初のコマンドを実行し、最初のコマンドが正常に完了しなかった(ゼロより大きいエラーコードを受け取った)場合にのみ、2番目のコマンドを実行します。

( ) [...] (command1 & command2)
複数のコマンドをグループ化またはネストするために使用します。

; or , command1 parameter1;parameter2
コマンドパラメータを区切るために使用します。

26
stan

私はJavaの ProcessBuilder またはシェルをシミュレート/使用する別のクラスを使用します。次のスニペットは、アイデアを示しています(bashを使用するLinuxの場合)。

import Java.util.Scanner;
import Java.io.*;

public class MyExec {
    public static void main(String[] args)
    {
        //init Shell
        ProcessBuilder builder = new ProcessBuilder( "/bin/bash" );
        Process p=null;
        try {
            p = builder.start();
        }
        catch (IOException e) {
            System.out.println(e);
        }
        //get stdin of Shell
        BufferedWriter p_stdin = 
          new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));

        // execute the desired command (here: ls) n times
        int n=10;
        for (int i=0; i<n; i++) {
            try {
                //single execution
            p_stdin.write("ls");
            p_stdin.newLine();
            p_stdin.flush();
            }
            catch (IOException e) {
            System.out.println(e);
            }
        }

        // finally close the Shell by execution exit command
        try {
            p_stdin.write("exit");
            p_stdin.newLine();
            p_stdin.flush();
        }
        catch (IOException e) {
            System.out.println(e);
        }

    // write stdout of Shell (=output of all commands)
    Scanner s = new Scanner( p.getInputStream() );
    while (s.hasNext())
    {
        System.out.println( s.next() );
    }
       s.close();
    }
}

これはWindowsに適合させる必要があるスニペットにすぎませんが、一般的にはcmd.exe

15
Jost