Skip to content

C# で引数に指定されたオプションを取得するには

幾つかのプログラミング言語では引数に指定されたオプションを取得する為に getopt ライブラリが用意されており、代表的なところでは GNU GetOptPython の getopt があるかと思います。

.NET Framework 標準ライブラリ中には getopt と同等のライブラリは無いようですが、幾つかライブラリが公開されているようです。

ここでは一番下の "C# Getopt class" を試してみます。

参照の追加

配布ファイルの中にはソースコード(Heyes.GetOpt.cs)と .dll に加え、サンプルも含まれています。VisualStudio から新規にプロジェクトを作成する際に「プロジェクト → 参照の追加」として .dll への参照を追加しても良いのですが、今回は「プロジェクト → 既存項目の追加」で "Heyes.GetOpt.cs" を追加しました。

file

使い方

オプションの解析に使う GetOpt クラスのメンバについては以下にドキュメントがありますので、こちらを参考に作業を進めました。

まず最初に今回、利用させて頂くライブラリの名前空間である "Heyes" を using しておきます。

1
using Heyes;

GetOpt クラスのインスタンスを作成し、SetOpts メソッドで解析したいオプションを指定します。指定可能なオプション(string 配列の中身)には以下のような意味があります。

  • "a" や "b" のように一文字であれば "-a" や "-b" のようなショート・オプションとして解析
  • "foo" のように複数文字であれば "--for" のようなロング・オプションとして解析
  • "bar=" のようにイコールが付いていれば、オプションの後に値を指定するオプションとして解析
1
2
3
GetOpt options = new GetOpt(args);
options.SetOpts(new string[] { "a", "b", "c", "foo", "bar=" });
options.Parse();

GetOpt クラスの IsDefined メソッドを使うと、オプション中に指定した文字列を含むか、否かを判定することが出来ます。

1
2
if (options.IsDefined("a"))
  Console.WriteLine("Returned 'a'");

GetOpt クラスの HasArgument メソッドを使うと、オプションが引数(値)を持っているか、判定することが出来ます。値が存在する場合は GetOptionArg メソッドでその値を取得することが出来ます。

1
2
if (options.IsDefined("bar") && options.HasArgument("bar"))
  Console.WriteLine("Returned 'bar' with argument '{0}", options.GetOptionArg("bar"));

サンプルコード

サンプルコードは以下の通りです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using Heyes;

namespace GetOptSample
{
  class Program
  {
    static void Main(string[] args)
    {
      GetOpt options = new GetOpt(args);
      try
      {
        options.SetOpts(new string[] { "a", "b", "c", "foo", "bar=" });
        options.Parse();
      }
      catch
      {
        // Show Usage.
        return;
      }

      // ----- Short Options -----
      if (options.IsDefined("a"))
        Console.WriteLine("Returned 'a'");

      if (options.IsDefined("b"))
        Console.WriteLine("Returned 'b'");

      if (options.IsDefined("c"))
        Console.WriteLine("Returned 'c'");

      // ----- Long Option -----
      if (options.IsDefined("foo"))
        Console.WriteLine("Returned 'foo'");

      // ----- Long Option with argument -----
      if (options.IsDefined("bar") && options.HasArgument("bar"))
        Console.WriteLine("Returned 'bar' with argument '{0}", options.GetOptionArg("bar"));
    }
  }
}

実行結果

実行結果は以下の通りです。

1
2
3
4
5
6
> GetOptSample.exe -a -b -c --foo --bar=ARGUMENT
Returned 'a'
Returned 'b'
Returned 'c'
Returned 'foo'
Returned 'bar' with argument 'ARGUMENT'

ショートオプションは "-a", "-b", "-c" のように個別ではなく、"-abc" とまとめて指定することもできます。

1
2
3
4
5
6
> GetOptSample.exe -abc --foo --bar=ARGUMENT
Returned 'a'
Returned 'b'
Returned 'c'
Returned 'foo'
Returned 'bar' with argument 'ARGUMENT'

ライセンス

サンプルコードを書いた後で気がついたのですが、このライブラリは PHPGuru license という、有料のライセンスのようです...