0

次のコードがあります。

ProcessStartInfo si = new ProcessStartInfo("cmd.exe");
si.RedirectStandardInput = true;
si.RedirectStandardOutput = true;
si.UseShellExecute = false;
si.WindowStyle = ProcessWindowStyle.Hidden;
si.CreateNoWindow = true;
Process p = Process.Start(si);
p.StandardInput.Write("ipconfig");
p.StandardInput.Write("exit");
string consoleOutput = p.StandardOutput.ReadToEnd();
string dir="here";

実行は "string consoleOutput" に到達しますが、"string dir" には到達しません。つまり、コードは StandardOutput の読み取りでスタックします。これにより違いが生じる場合は、コンソール アプリケーション内から実行されます。

4

2 に答える 2

1

ストリームを閉じて、標準入力への書き込みを明示的に終了する必要があります。Microsoft の例を参照してください。

要約すれば:

        p.StandardInput.Write("exit");
        p.StandardInput.Close(); // <-- You need this
        string consoleOutput = p.StandardOutput.ReadToEnd();

編集:Visual Studioでテスト済み。

ちなみに、WriteLine()代わりに使いたいのはWrite().

于 2013-01-31T10:10:30.230 に答える
0

最後の改行で文字列を書くWriteLine代わりに使用します。Write(あなたも電話する必要があるかもしれませんがFlush()、私にはわかりません)。Close別の回答が言うように、ストリームに害はありません。

はい、必要ありません。直接cmd.exe開始できますipconfig(コメントで@Peteshのアドバイスに従って)。

于 2013-01-31T10:17:50.297 に答える