|
.NET TIPS コンソール・アプリケーションの出力を取り込むには?[C#、VB]デジタルアドバンテージ 遠藤 孝信2007/10/11 |
![]() |
|
|
|
「TIPS:コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには?」では、Windowsアプリケーションなどから外部のコンソール・アプリケーションを実行する場合に、コマンド・プロンプトを表示させずに実行する方法について解説しているが、この際、実行する外部アプリケーションによっては、その画面出力がプログラムで必要になることがある。
本稿ではプログラムからコンソール・アプリケーションを実行し、その出力を取得する方法について解説する。
標準出力とそのリダイレクト
本題に入る前に、コンソール・アプリケーションの出力について簡単に説明しておこう。
たいていのコンソール・アプリケーションは実行結果などを画面(通常はコマンド・プロンプト)に表示するが、これはコンソール・アプリケーションが画面に描画を行っているわけではない。コンソール・アプリケーションは文字を「標準出力」に出力しているだけである(最終的にはコマンド・プロンプトが標準出力への出力内容を読み取って画面に文字を表示する)。
このため例えば、あらかじめコンソール・アプリケーションの標準出力への出力がファイルに書き込こまれるように設定して実行*すれば、コンソール・アプリケーション自体はそのままに、その出力先を画面からファイルへ切り替えることができる。このような出力先の切り替えは「リダイレクト」と呼ばれる。
| * コマンド・プロンプト(cmd.exe)では、「>」記号により標準出力をファイルにリダイレクトできる。例えば「ipconfig.exe > result.txt」とすると、ipconfig.exeの実行結果がresult.txtというファイルに格納される。これは、シェルであるcmd.exeがipconfig.exeを実行する際にipconfig.exeの標準出力を読み込み、その出力をresult.txtというファイルに書き込んでいるためだ。 |
ProcessStartInfoクラスのRedirectStandardOutputプロパティ
プログラム内から実行したコンソール・アプリケーションの出力を取得するには、その標準出力をリダイレクトさせることにより可能となる。この設定は、プロセス起動時の設定情報となるProcessStartInfoクラス(System.Diagnostics名前空間)のRedirectStandardOutputプロパティで指定する。このプロパティをtrueに設定したProcessStartInfoオブジェクトを、外部アプリケーションを実行するためのProcess.Startメソッドに渡せばよい(下記のサンプル・コードを参照)。
なお、RedirectStandardOutputプロパティをtrueに設定した場合には、UseShellExecuteプロパティをfalseに設定しておく必要がある。
リダイレクトされた外部アプリケーションの出力は、プログラムではストリームとして読み出すことができる。このストリームはProcessクラス(System.Diagnostics名前空間)のオブジェクトのStandardOutputプロパティによりアクセスできる。
Processオブジェクトは、実行中のアプリケーション(=プロセス)を示すオブジェクトである。Process.Startメソッドによりアプリケーションの実行を開始した場合には、実行が開始されたアプリケーションを示すProcessオブジェクトをメソッドの戻り値として受け取ることができる。
コンソール・アプリケーションの出力を取り込むサンプル・コード
以下のコードは、コンソール・アプリケーションであるipconfig.exe(Windowsに標準搭載されている、ネットワーク設定情報を表示するためのコマンド)を、コマンド・プロンプトを表示せずに実行し、その出力を取り込むサンプル・コードだ。
例えばVisual StudioでWindowsアプリケーションを新規作成し、Windowsフォームに配置したボタンのClickイベント・ハンドラにこのコードをペーストして実行すれば、そのボタンをクリックしたときにipconfig.exeの実行結果が[出力]ウィンドウに表示される。
| ||
| ipconfig.exeを実行してその出力を表示するサンプル・コードその1(上:C#、下:VB) | ||
| このコードを記述する場合にはSystem.Diagnostics名前空間をインポートしている必要がある。 |
上記のコードは静的メソッドであるProcess.Startメソッドを利用するために、まずProcessStartInfoオブジェクトを作成してから外部アプリケーションを開始し、その後Processオブジェクトを得ているが、次のようにまずProcessオブジェクトを明示的に作成するような記述も可能である。
| ||
| ipconfig.exeを実行してその出力を表示するサンプル・コードその2(上:C#、下:VB) | ||
| 処理内容は上記のサンプル・コードその1とまったく同じ。このコードを記述する場合にはSystem.Diagnostics名前空間をインポートしている必要がある。 |
このコードではProcessStartInfoオブジェクトの設定を、ProcessオブジェクトのStartInfoプロパティを通じて行う。ProcessStartInfoオブジェクトはProcessクラスにより暗黙的に作成される。![]()
| カテゴリ:クラス・ライブラリ 処理対象:Windows環境 使用ライブラリ:ProcessStartInfoクラス(System.Diagnostics名前空間) 使用ライブラリ:Processクラス(System.Diagnostics名前空間) 関連TIPS:コマンド・プロンプトを表示せずにコンソール・アプリケーションを実行するには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


