2

複数のコマンドを実装する方法の解決策を見つけようとしています-Windows cmdシェルとの応答相互作用。例:

  1. コマンド シェルを起動する
  2. 「ディレクトリ」
  3. 入力を待って処理する
  4. 入力内容に応じて新たなコマンドを実行
  5. 入力を待って処理する

ご注意ください!上記の手順は、通信方法を説明するためだけのものでした。ファイル システムをブラウズするつもりはありません。つまり、実際のコマンドは別のものである可能性があります。

これまでのアプローチ:

try {            

        Runtime rt = Runtime.getRuntime();

        p = rt.exec("cmd");
        error = p.getErrorStream();
        input = p.getInputStream();
        output = new PrintStream(p.getOutputStream());            

        StreamGobbler errGobbler = new StreamGobbler(error, "ERROR");
        StreamGobbler inGobbler  = new StreamGobbler(input, "INPUT");

        errGobbler.start();
        inGobbler.start();

        output.println("dir");
        output.flush();

        sleep(5);

        output.println("dir");
        output.flush();
} catch (IOException e) {
        System.out.println(e.printStackTrace());
}

StreamGobbler クラス:

class StreamGobbler extends Thread
{
    InputStream is;
    String type;
    ArrayList<String> cmdRespArr = new ArrayList<String>();

    StreamGobbler(InputStream is, String type) {
        this.is  = is;
        this.type = type;
}

public void run() {

    try  {
        InputStreamReader isr = new InputStreamReader(is);
        BufferedReader bf = new BufferedReader(isr);
        String line = null;
        while ( ( line = bf.readLine() ) != null ) {
            cmdRespArr.add(line);
        }
    } catch (IOException ioe) {
        ioe.printStackTrace();
    }
}

}

ただし、この例では、run メソッドの while ループは、発行されたコマンド間で戻ることはありません (これは問題の一部ではありません)。

したがって、アプローチは、while メソッドがコレクションまたは他のコンテナーに読み取られた行を追加し、cmd シェルが入力の準備ができていることを示す何かを監視することです (これは、以前からのすべての利用可能な入力を示します)。コマンドが読み込まれました)。そして、次のコマンドを発射しますか?

上記の例では、この指示により、現在デバッグ目的でのみ存在するスリープ コールが取り除かれます。

Pythonでやったときのアプローチがこれだったという漠然とした記憶があります。

それとも、これは完全に間違っていますか?

4

1 に答える 1

1

複数のコマンド プロセッサ (コマンドごとに 1 つ) を起動することは解決策になりますか?

1 つのコマンド プロセッサを開いたままにしておくと、出力を 1 行ずつ解析し、出力にプロンプ​​トが表示されるまで待たない限り、コマンドがいつ処理されたかを判断するのが非常に難しいためです。

複数のプロセッサを使用する場合、つまり「cmd /c dir」を実行すると、コマンドが完了する (および関連するプロセスが終了する) と、入出力 redir が閉じます。

もちろん、いくつかのコマンドが他のコマンドに依存している場合、たとえば chdir を実行し、次のコマンドがそのディレクトリで機能することを期待している場合、これは機能しません。

于 2013-06-12T11:01:42.127 に答える