2012-04-25 10 views
1

このトピックに関する上記の質問のいずれかがこの問題の回答であるとは思われません。私はリモートexeファイルを実行するためにpsexecを使用します。私はコマンドラインで実行すると、exeファイルの出力を取得しています。 psexec.exe \\machine C:\somename.exe
私はシャープなプロセス実行を使用すると、ハングするか、出力をリダイレクトしません。いくつかのexeのタイムアウトのためにいくつかのリダイレクトされた標準出力は空で、Exeはコード0で終了しました。出力をキャプチャする方法はありますか?PsExec v 1.98出力リダイレクトの問題

ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.FileName =GetPsExecPath(); 
     startInfo.Arguments = arguments; 
     Debug.WriteLine(arguments); 
     startInfo.UseShellExecute = false; 
     startInfo.RedirectStandardError = true; 
     startInfo.RedirectStandardOutput = true; 
     startInfo.CreateNoWindow = true; 
     Process process = new Process(); 
     process.StartInfo = startInfo; 
     process.Start(); 
     process.WaitForExit(); 
     error = process.StandardError.ReadToEnd(); 
     output = process.StandardOutput.ReadToEnd(); 
     Debug.WriteLine(error); 
     Debug.WriteLine(output); 
     process.close(); 

編集:私たちがReadToEndを(使用している場合、デッドロックにつながるかもしれwhtever SOLN だから問題は、主原因であるPSEXECは、標準エラー出力、したがって、我々はそれらを読んでいるために、他の多くのものを投げます) 。したがって、BeginOutputReadLineを使用すると、チャームのように機能します!

+1

psexecの実行に使用するコードを表示します。 –

+0

また、出力とエラーをリダイレクトして実行しないと、コード0で終了します。リダイレクトすると、これらのpblmsが発生します。 – sriram

+0

、コマンドラインで実行するとデータが返されますか?プログラムで渡すのと同じ引数を使用していますか? –

答えて

4

このコードスニペットは、デッドロックを引き起こす可能性が非常に高いです。最初にStandardErrorを読み込んだので、StandardOutput。つまり、process.StandardOutput.ReadToEnd()は、プロセスが終了するまで呼び出されません。つまり、psexecは十分な文字でいっぱいになったときにstdout出力バッファをフラッシュすることができません。それはブロックされ、決して終わらないことを意味します。デッドロック市。

2つの呼び出しを交換するほうがはるかに優れています。ほとんどのプログラムは大量の出力をstdoutに送ります。しかし、psexecが何らかの理由でstderrに多くの文字を書き込むと、デッドロックが発生する可能性があります。代わりに、BeginOutputReadLineとBeginErrorReadLineを使用して、これを完全に排除します。

+1

ありがとう.. thts素晴らしい。それは問題を解決します。 – sriram