目次

概要

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.exeC:\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
テスト テスト テスト

更新履歴

test

[雑記]

ブログ