|
|
連載
改訂版
プロフェッショナルVB.NETプログラミング
Chapter 15 コンソール・アプリケーション
株式会社ピーデー
川俣 晶
2004/09/23 |
|
|
Visual Studio .NETでコンソール・アプリケーションを作成する準備は簡単である。新しいプロジェクトの作成時に、Windowsアプリケーションの代わりに、コンソール・アプリケーションのテンプレートを選ぶだけでよい(図15-15)。
|
●図15-15 VB.NETでの新しいプロジェクトの作成ダイアログ |
すると、リスト15-16のような非常にシンプルなソース・コードが自動的に生成される。
1: Module Module1
2:
3: Sub Main()
4:
5: End Sub
6:
7: End Module
|
|
リスト15-16 テンプレートでコンソール・アプリケーションを選択した場合に自動作成されるコード
|
わずかこれだけである。コンソール・アプリケーションはウィンドウを作成しないので、フォームもいらない。ラベルやテキスト・ボックスを貼り付けるような開発スタイルをとることはできない。出力したい内容は、すべて自分でプログラムとして書き込む必要がある。
さて、このソースの内容を説明しておこう。まず、1行目のModule文は、このソースがモジュールであることを指定している。つまり、これはクラスやフォームではなく、ただ単にメソッドなどを含むだけのソースファイルであることを意味している。そして、3行目のSub Main()は、プログラム実行時に最初に実行されるメソッドを定義するものである。最初に実行されるモジュールやメソッドは、プロジェクトのプロパティで指定されている(図15-17)。
|
●図15-17 コンソール・アプリケーションにおけるプロジェクトのプロパティの例 |
ここのスタートアップの設定がModule1となっているため、モジュールModule1にあるSub Main()が最初に実行されることになる。もし、ほかのモジュールにSub Main()があったとしても、それは実行されない。しかし、このスタートアップの設定をほかのモジュールに変えれば、そのモジュールのSub Mainが最初に実行されることになる。
なお、この設定では、モジュール名だけでなく、Sub Main()という設定も選ぶことができるが、これはSub Main()が1個だけ存在する場合にそれを最初に実行する設定である。プログラムに2個以上Sub Main()が存在する場合は、コンパイル・エラーになる。
さて、このままでは何も出力しないまま終了するだけのプログラムになってしまい、動作が分かりにくいので、文字列を出力する機能を与えてみよう。コンソールに文字列を出力するには、クラス・ライブラリのSystem.ConsoleクラスのWriteLineメソッドを使用する。これは、引数の値をコンソールに出力して改行する機能を持ったメソッドである。これをSub Main()に組み込んでみよう(リスト15-18)。
1: Module Module1
2:
3: Sub Main()
4: Console.WriteLine("Hello World!")
5: End Sub
6:
7: End Module
|
|
リスト15-18 Console.WriteLineによりコンソールに文字列を出力するプログラム
|
さて、さっそく[F5]キーを押してビルドと実行… と思うのはまだ早い。というのは、もし[F5]キーを押して実行しても、プログラムの実行は瞬間的に終了して、コマンド・プロンプトのウィンドウが閉じてしまい、本当に指定した文字列が出力されたかどうか分からないからだ。ここはVisual Studio .NET上で、5行目のEnd Subにキャレットを移動し、[F9]キーを押して、ブレークポイントを設定しよう。そして、この設定後に[F5]キーを押してプログラムを実行する。間違いがなければ、新しいコマンド・プロンプトのウィンドウが開いて、指定した文字列が表示されるはずである(図15-19)。
|
●図15-19 リスト15-18の実行結果6 |
単独で開いたコマンド・プロンプトから実行すると、図15-20のようになる。
|
●図15-20 リスト15-18をコマンド・プロンプトから実行した結果 |
これは、最初にcdコマンドでカレント・ディレクトリを実行ファイルのあるディレクトリに移動させ、次にdirコマンドでファイルの存在を確認してから、実際に実行してみた例である。この場合、実行ファイルはSample001n.exeなので、「Sample001n 」と入力することで実行することができる。
GUIアプリケーションなら、プログラムに何かの指定を入力させたいとき、ダイアログ・ボックスを開いて入力を促せばよい。だが、通常、自らウィンドウを開かないコンソール・アプリケーションでは、どうやってユーザーから情報をもらえばよいのだろうか?
そのために、主に利用される機能がコマンドライン引数である。例えば、pingコマンドで「www.piedey.co.jp」にアクセスするには、コマンドラインから「ping www.piedey.co.jp」と入力する。すると、ping.exeというコマンドが実行され、後半のwww.piedey.co.jpは、コマンドライン引数としてping.exeに引き渡される。このように、コマンド名に続いて空白文字を入れて、プログラムに指定したい文字列を記述することができる。
では、コマンドライン引数に指定された文字列をプログラムから参照するにはどうすればよいのだろうか?
実際には、コマンドライン引数そのものは、GUIアプリケーションにも存在しており、それを扱う機能はVB 6にも含まれている。次のようにCommand関数を参照することで、引数を参照することができる。リスト15-21はそれを使用した例である。
1: Private Sub Form_Load()
2: MsgBox Command
3: End Sub
|
|
リスト15-21 Command関数により引数を参照するプログラム
|
このソースからEXEファイルを作成して、コマンドラインから呼び出してみよう(図15-22)。図15-23のようなメッセージボックスが表示されるはずである。
|
●図15-22 リスト15-21を引数を指定してコマンドラインから実行する |
|
●図15-23 リスト15-21を上記の方法で実行した実行結果 |
見てのとおり、コマンド名に続いて入力された文字列を、そのままCommand関数で参照できていることが分かると思う。
さて、VB.NETにはCommand関数が引き継がれている。しかし、それと同時に、Sub Mainの引数でコマンドライン引数を受け取ることもできるようになっている。実際に、それができることを確認するために、以下のようなサンプル・プログラム「Sample002n3」を記述してみた。
1: Module Module1
2:
3: Sub Main(ByVal CmdArgs() As String)
4: Console.WriteLine(Command())
5: Dim s As String
6: For Each s In CmdArgs
7: Console.WriteLine(s)
8: Next
9: End Sub
10:
11: End Module
|
|
リスト15-24 Command関数とSub Mainの引数の両方でコマンドライン引数を受け取るプログラム「Sample002n3」
|
3行目を見て分かるとおり、Sub Mainの引数が増えている。そして、それは文字列の配列という形になっている。つまり、Command関数を使用すると全体を1個の文字列として取得する形になるが、引数では引数の文字列を分割された形で受け取ることができる。
さて、実際にこれを実行してみよう。
|
●図15-25 「Sample002n3」を、引数を指定して実行した結果 |
このように、どちらの機能を使っても、コマンドライン引数の値が取得できていることが分かるだろう。しかし、空白を含んだ引数を指定すると、同じ結果にならない。
|
●図15-26 「Sample002n3」を、空白文字を含んだ引数を指定して実行した結果 |
Sub Mainの引数でコマンドライン引数を取得する場合、空白文字は引数の区切り文字として機能するので、配列に2つの文字列が入った形で取得される。もし、1つの文字列で取得させたい場合は、引数を「"」(ダブルクォーテーション)記号でくくる。
|
●図15-27 「Sample002n3」を「"」で囲んだ引数を指定して実行した結果 |
Sub Mainの引数の場合、「"」記号はあくまで引数の項目の範囲を明示するための記号として見なされ、配列変数の中には入らない。すべての文字列を忠実に保持するCommand関数とは大きく違っている。この挙動は、複数のファイル名などをコマンドライン引数で受け取るときに便利である。例えば「c:\test.txt」と「c:\hello world.txt」という2つのファイル名をコマンドライン引数で渡すとき、一般的なコマンド・プロンプト上の慣習と同じく、空白文字を含むファイル名は「"」記号でくくって記述するとすれば、この挙動はまさに期待に合致する。実際に試してみると、以下のような結果になる。
|
●図15-28 「Sample002n3」を、複数の引数を指定して実行した結果 |
これを見て分かるとおり、Command関数経由で取得すると、ファイル名を取り出すために、あとから面倒は文字列操作を行う必要があるが、Sub Mainの引数なら、即座にそのままファイル名として利用できる。