目次

(追記) (追記ここまで)

概要

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
テスト テスト テスト

更新履歴

ブログ


誤字等を見つけた場合や、ご意見・ご要望がございましたら、GitHub の Issues まで気兼ねなくご連絡ください。
(追記) (追記ここまで)
(追記) (追記ここまで)
(追記) (追記ここまで)
(追記) (追記ここまで)
(追記) (追記ここまで)
(追記) (追記ここまで)

AltStyle によって変換されたページ (->オリジナル) /