20. MyCommandLine の使い方
Programmable Block のスクリプトでは、コマンドライン引数をすばやく、簡単に処理できる MyCommandLine がコマンドラインパーサーとして用意されています。この MyCommandLine を使えば、コマンドラインに含まれる、引数とスイッチを簡単に取り出すことができます。
17-1. コマンドラインのフォーマット
コマンドラインは、「引数」と「スイッチ」からなり、ダブルクォーテーションで囲まれていないスペースは、これら「引数」や「スイッチ」のセパレータ(区切り)となります。
「引数」
ひとつの単語またはダブルクォーテーションで囲まれた文字列のいずれかです。引数にアクセスするときは、配列のようにインデックスを使い、コマンドライン中の最初の引数をインデックス 0、2 番目をインデックス 1 として順番にインデックスが付与されます。
「スイッチ」
MyCommandLine では、スイッチは単語の前にハイフンを付けて表します。スイッチはひとつの単語のみ(空白は不可)が使用でき、コマンドライン中の任意の場所に配置できます。スイッチは引数のインデックス付与には影響を与えませんので、コマンドライン中のどこに挿入しても引数のインデックスは変わりません。
例として以下のふたつのコマンドラインを見てみます。
-
cycle "Airlock 1" in -emergency
-
-emergency cycle "Airlock 1" in
これらの2つのコマンドラインを MyCommandLine で処理すると、以下の 3 つの引数と
1. cycle
2. Airlock 1
3. in
1 つのスイッチとして認識されます。
-emergency
17-2. 引数とスイッチへのアクセス
引数は、インデックス番号を指定して取得します。下の例では、コマンドラインから最初(インデックス 0)の引数を取り出し、文字列 arg に代入しています。
string arg = _commandLine.Argument(0);
スイッチへのアクセスは、Switch メソッドを使用します。Switch メソッドで特定のスイッチを表す文字列を指定すれば、コマンドラインにそのスイッチが含まれているかをチェックできます。コマンドラインに指定のスイッチが含まれていれば true を、含まなければ false を返します。Switch メソッドに渡す特定のスイッチを表す文字列にハイフンは含めません。下の例では、スイッチ -myflag が含まれているかチェックし、結果を bool 型の switchIsSet に代入しています。
bool switchIsSet = _commandLine.Switch("myflag");
17-3. 実装例
以下は MyCommandLine の実装例です。「1. コマンドラインのフォーマット」で例に挙げたコマンドラインを入力とした場合を想定しています。
コマンドラインとして受け取った文字列 argument を MyCommandLine の TryParse メソッドで解析し、最初の引数を string 型の command に代入しています。ここでは、この最初の引数が "cycle" である場合、Cycle メソッドを呼びます。
Cycle メソッドでは、さらに第 2、第 3 引数の取得と、スイッチとして "emergency" が指定されているかのチェックをし、値によって処理を分岐しています。
MyCommandLine commandLine = new MyCommandLine();
public void Main(string argument)
{
if (commandLine.TryParse(argument)){
string command = _commandLine.Argument(0);
if (command == "cycle"){
Cycle();
}
}
}
public void Cycle()
{
bool emergencyCycle = commandLine.Switch("emergency");
string airlockName = commandLine.Argument(1);
string direction = commandLine.Argument(2);
if (string.Equals(direction, "in", StringComparison.OrdinalIgnoreCase)){
// 第3引数が "in" の場合の処理
}
else if (string.Equals(direction, "out", StringComparison.OrdinalIgnoreCase)){
// 第3引数が "out" の場合の処理
}
}