![](https://static.wixstatic.com/media/ea798a_1e5d4aafb98d429cbcb7a33527d100de~mv2.jpg/v1/fill/w_1920,h_1080,al_c,q_90,enc_avif,quality_auto/ea798a_1e5d4aafb98d429cbcb7a33527d100de~mv2.jpg)
3. コマンドライン引数
public void Main(string argument, UpdateType updateSource)
{
}
Main メソッドはデフォルトで、string 型の argument と Update 型の updateSource の 2 つの引数を持ちます。これら 2 つの引数はどちらも省略可能です。ただし、argument のみを持つ Main メソッドは作れますが、argument を省略して updateSource のみを持つ Main メソッドは作れません。
3-1. argument
プログラマブルブロックのターミナルにある、Argument というテキストボックスに文字列を入力しておけば、コマンドライン引数として Mainメソッドで string 型の変数 argument として受け取ることができます。
![Argument.jpg](https://static.wixstatic.com/media/ea798a_e7703c57267245eeae78ed00430b1796~mv2.jpg/v1/fill/w_506,h_283,al_c,q_80,usm_0.66_1.00_0.01,enc_avif,quality_auto/Argument.jpg)
Argument にコンマなどのセパレータで区切った string 型の文字列を入れ、Main メソッド内で以下のようにセパレータを指定して切り分けることで、複数の値を渡すことができます。
この他に Programmable Block のスクリプトでは、コマンドライン引数を処理する MyCommandLine が用意されています。この MyCommandLine を使えば、引数とスイッチを簡単に取り出すことができます。MyCommandLine の使い方については「17. MyCommandLine の使い方」をご覧ください。
var arguments = argument.Split(',');
3-2. updateSource
UpdateType 型の updateSource 引数は、このプログラムがどのように実行が開始されたかを以下のように表します。
None = 0
Terminal = 1 << 0 ターミナルからユーザーにより実行
Trigger = 1 << 1 タイマーやセンサーなどのブロックにより実行
Antenna = 1 << 2 メッセージを受信したアンテナにより実行
Mod = 1 << 3 mod により実行
Script = 1 << 4 他のプログラマブルブロックにより実行
Update1 = 1 <<5 Self-update System の Update1 設定により実行
Update10 = 1 << 6 Self-update System の Update10 設定により実行
Update100 = 1 << 7 Self-update System の Update100 設定により実行
Once = 1 << 8 Self-update System の Once 設定により実行
この updateSource は上に示した 10 個のフラグのどれかひとつを表すのではなく、すべてのフラグの状態を表すビットフラグであり、ひとつの値に複数のフラグ情報を持ちます。例えば Main の呼び出しが、Update1, Update10, Update100 によって同一タイミングで発生した場合、Main の呼び出しは 3 回発生するのではなく、これら3つのフラグが ON となっている updateSource を引数に 1 回だけ Main の呼び出しが発生するようです。
このように updateSource はビットフラグであるため、単純な == による比較は行えませんので、以下に示すようにビット演算を使って各フラグの状態を判定します。
if((updateSource & UpdateType.Update100) != 0){
//Update100 により実行される
}
if((updateSource & (UpdateType.Update1 | UpdateType.Update10)) != 0){
//Update1 または Update10 により実行される
}
また、次のように HasFlag メソッドを使ってもフラグの判定はできますが、上のビット演算による判定のほうが桁違いに速いのでおすすめです。
if(updateSource.HasFlag(UpdateType.Update1)){
//Update1 により実行される
}