0

重複の可能性:
コマンド プロンプトの出力が空の文字列として読み取られる

コードがグルーヴィーなタンを実行できるようになる前に、少なくとも 1 回は実行する必要があるコマンド ライン プログラムがあります。だから私はProcessそれを実行するために使用します。これはうまくいくようです。

私の問題は、プログラムが完了するときにプログラムが何を言っているのかを確認できるようにしたいという事実にあります。場合によっては、続行する前にユーザーの介入が必要なエラーが返されることがあります。紙の上では、これは些細なことのように思えます。悲しいことに、私のコード (以下) は機能していないようです:

Process p = new Process();
ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = String.Format("/C adb forward tcp:{0} tcp:5574",port.ToString());
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
p.StartInfo = startInfo;
p.Start();
string adbResponse = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (adbResponse.Contains("error"))
{
    // Device not connected - complain loudly
}

自分で作成した CMD ウィンドウでこれを実行しようとすると、エラーという単語を含む応答を確実に誘導できます。(具体的には何かを抜くことによって。)ただし、同じ条件下では、adbResponse文字列は空のままです。私は何が欠けていますか?

4

2 に答える 2

2

コンソール接続プロセスには、2 つの異なる出力ストリームがあります。あなたは罠にかかっStandardOutputていますが、おそらく捕まえたいと思っていますStandardError。完全な説明 (およびデッドロックなしで両方を安全にキャプチャするためのコード) については、この質問を参照してください。

コマンド プロンプトの出力が空の文字列として読み取られる

于 2012-07-13T16:58:47.997 に答える
0

そのようなことを試してください:

p.StartInfo.RedirectStandardOutput = true;
//p.WaitForExit();
StringBuilder value = new StringBuilder();
while ( ! p.HasExited ) {
    value.Append(p.StandardOutput.ReadToEnd());
}
string result = value.ToString();
于 2012-07-13T17:00:52.190 に答える