概要
C# にはコマンドライン引数は Main
関数の引数としてプログラムに渡されます。
ここでは、コマンドライン引数というものが何なのかを簡単に説明した後、
C# でコマンドライン引数を受け取る方法について説明します。
ポイント
-
コマンドライン引数: プログラム起動の際に渡されるオプションの値
-
C# では、Main 関数の引数として受け取れる
コマンドライン引数とは
コマンドプロンプト(Win9x の場合は「DOS プロンプト」と呼ばれる)上でファイルのコピーを行う場合、 copy というコマンドを利用します。copy は以下のようにして、コピー元のファイルとコピー先のディレクトリ(フォルダ)を指定することによってファイルのコピーを行います。
copy コピーするファイル コピー先のディレクトリ
このように、コマンドやプログラムを起動する際に、プログラム名の後に続けて入力した文字列はパラメータとしてプログラムに渡されます。 このようなプログラム起動時に渡されるパラメータのことをコマンドライン引数と呼びます。
また、コマンドライン引数はコンソールアプリケーション(コマンドプロンプトで呼び出される文字ベースのプログラム)だけでなく、GUI アプリケーションでも利用することが出来ます。 例えば、スタートメニューから [プログラム名を指定して実行] を選んで、 以下のように入力してみてください。
explorer.exe
以下のようにエクスプローラのウィンドウが開くと思います。 (以下のものは Windows XP で実行した結果)
同様にスタートメニューから[プログラム名を指定して実行]を選んで、今度は以下のように入力してみてください。
explorer.exe /e,/root,"C:\Program Files\Internet Explorer"
以下のように、先ほどと内容の異なる形式でエクスプローラが起動します。
「/e,/root,"C:\Program Files\Internet Explorer"
」という文字列がコマンドライン引数としてエクスプローラに渡され、その結果としてエクスプローラの表示形式が変わったわけです。
C#でコマンドライン引数を利用する
今まで、Main
関数には引数を書いていませんでしたが、
コマンドライン引数を受け取りたい場合には、以下のように Main
関数に string[]
型の引数を書きます。
static void Main(string[] args)
プログラムに与えた引数はこの args
に格納されます。
(args は arguments (引数)の略で、慣習的にこの名前が良く用いられます。)
コマンドライン引数はスペースで区切って複数与えることが出来ます。
この際、コマンドライン引数は先に入力されたものから順に args
に格納されていきます。
例えば、以下のようなプログラムを作成し、
using System;
public class CommandLineSample
{
public static void Main(string[] args)
{
for(int i=0; i<args.Length; ++i)
Console.Write("{0}番目のコマンドライン引数は{1}です。\n", i, args[i]);
}
}
以下のようにして(ただし、test.exe
という名前で作成した実行ファイルを作成したとします)
実行すると、
test aaa bbb ccc ddd
以下のような結果が得られます。
0番目のコマンドライン引数はaaaです。 1番目のコマンドライン引数はbbbです。 2番目のコマンドライン引数はcccです。 3番目のコマンドライン引数はdddです。
終了コード
コマンドライン引数の他に、プログラムには終了コードというものがあります。 終了コードとは、プログラムが正しく終了したかどうかなどの情報を得るために、 プログラム終了時に返す値のことです。
C# でプログラムを作る際、自分で終了コードを指定したい場合、Main
関数の戻り値の型をint
型にします。
Main
関数の戻り値がそのままプログラムの終了コードになります。
例えば、以下のようなプログラムを書いた場合、終了コードは0になります。
public class CommandLineSample
{
public static int Main()
{
return 0;
}
}
習慣的に、正常終了したときに0を返し、それ以外のときには0以外の値(エラーの原因に応じて値を変える)を返すようにします。
サンプル
using System;
using System.IO;
public class CommandLineSample
{
/// <summary>
/// コマンドライン引数でファイル名を受け取り、そのファイルの中身を表示する。
/// コマンドライン引数の数がおかしかった場合や、
/// ファイルが見つからない場合や、ファイルのアクセス権限がない場合、
/// 終了コード -1 を返して終了する。
/// 正常終了した場合には終了コード 0 を返す。
/// </summary>
public static int Main(string[] args)
{
// 引数チェック
if(args.Length != 1)
{
Console.Write("引数の数がおかしいです\n");
return -1;
}
StreamReader reader = null;
try
{
// ファイルを開いて中身を表示
reader = new StreamReader(args[0]);
string text = reader.ReadToEnd();
Console.Write(text);
}
catch(Exception e)
{
// エラー処理
// 詳しくは「例外処理」で説明します。
// ファイルが存在しなかったり、アクセス権限がない場合にここが実行される。
Console.Write(e.Message+"\n");
return -1;
}
finally
{
// 後処理
// これも「例外処理」で説明します。
if(reader != null)
reader.Close();
}
return 0;
}
}
プログラムの実行ファイル名はtest.exe
とする。
test.exe
はC:\mydoc
にあるものとして、
同じディレクトリ中にtest.txt
というファイルがあって、
その中身が
test test test test
テスト テスト テスト
であるとき、実行結果は以下のようになる。
C:\mydoc> test
引数の数がおかしいです
C:\mydoc> test aaa
Could not find file "C:\mydoc\aaa".
C:\mydoc> test test.txt
test test test test
テスト テスト テスト