0

したがって、出力を取得するためだけに「java -version」で始まる、特定の Java コマンドを実行するバット スクリプトを起動するこのコードがあります。初めて呼び出したときは機能しましたが、2回目は黒いcmd画面で立ち往生しています。

同じコードが使用されていますが、場所が異なります。

Process proc = new Process();
ProcessStartInfo StartInfo = new ProcessStartInfo();
StartInfo.RedirectStandardOutput = true;
StartInfo.RedirectStandardError = true;
StartInfo.FileName = path + "javaScript.bat";
StartInfo.Arguments = "\"" + path + "\"";
StartInfo.UseShellExecute = false;
StartInfo.CreateNoWindow = false;

proc.StartInfo = StartInfo;

proc.Start();

proc.WaitForExit();

string output = proc.StandardOutput.ReadToEnd();

誰でも何が起こるかを理解するのを手伝ってくれますか? エコーが得られないので、batファイルがどこかにスタックしているとは思えません(エコーがオンで、最初のコマンドは java -version であるため、黒いコマンドウィンドウでスタックするのではなく、何かを書き込む必要があります)

4

1 に答える 1

3
        proc.WaitForExit();
        string output = proc.StandardOutput.ReadToEnd();

このコードでプロセスをデッドロックしています。出力バッファを空にするまで終了できません。ただし、終了するまで出力を読みません。プログラムは続行できません。あなたも続行できません。デッドロックとしてよく知られている「致命的な抱擁」。

この 2 行のコードを入れ替えるだけで、問題を解決できます。

StandardError にも問題があることに注意してください。そのストリームに一連のエラー テキストを送信すると、依然としてデッドロックが発生します。読みたくない場合は、リダイレクトしないでください。完全にソリッドにしたい場合は、BeginErrorReadLine と BeginOutputReadLine を使用する必要があります。

于 2013-08-01T13:46:32.423 に答える