- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コマンド実行時の結果のリダイレクト)
コマンド実行結果のリダイレクト方法
このQ&Aのポイント
- コマンド実行時にプロンプトに表示される結果文字列を取得する方法について説明します。
- プロセスが終了するまで待つことなく、実行中のプロセスの結果を参照する方法を紹介します。
- 参考URL先の[プロセス名].StandardOutput.ReadToEndを使用する方法以外にも、処理進捗率を取得する方法についても解説します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- Wr5
- ベストアンサー率53% (2173/4061)
回答No.1
>参考URL先にあります、 >[プロセス名].StandardOutput.ReadToEnd >この取得方法ではプロセスの終了まで待たねばなりません。 >完了していないプロセスのoutput を参照するには >どのようにすればよいのでしょうか。 StandardOutputプロパティのReadToEndメソッドではなく、 BeginOutputReadLineメソッドで非同期読み込みにしてみてはどうでしょうか? 使い方に関しては… http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.beginoutputreadline.aspx の解説を。
質問者
お礼
ありがとうございます。 少々難しく、未だ目的を果たすコードはかけておりませんが、 リンク先の解説やサンプルを参考に試してみます。
質問者
補足
ご報告です。非同期でのリダイレクト取得が出来ました。 ありがとうございます。しかし、実は根っこの目的というのが >処理終了までに5分くらい >10秒毎に現在の処理進捗率を吐きます このプロセスの現在の進捗を定期的に画面に表示 することなのです。 Outputreadlineの中身をセッションに持てば、 後は定期的に格納先の変数をみればよい、 と、考えて居たのですが画面を1度でも返した時点で サーバーコントロールも終了してしまい、 続きを取得・表示することは出来ませんでした。 この目的を果たすためには、何か他の方法を考える必要がありそうです。
お礼
todo36様 ありがとうございます。 プロセスの終了を待たない、という点で 以前に相談した質問と同じ考え方が出来たのですね。 今回は(リンク先スレッドで教えて頂いた)3番の方法、 非同期のスレッドを立てる方法で実現が出来ました。 1.メインスレッドでExeを実行。 2.リダイレクト処理を続けるサブスレッドを作成し、 リダイレクトされた内容をOutputreadlineで1行ずつ取り セッション変数 (session("templog")) に格納。 3.メインスレッド側は定期的に session("templod") を参照し、画面を更新。 4.Exeを実行したプロセスが終了していたら、画面更新を終了 と、いったコードを書くことで、 目的である未完了のプロセスのリダイレクト表示 (現在実行中であることと、その進度の表示)を得る事ができました。 ありがとうございました。