C# でコマンドライン引数を解析する

Saad Aslam 2023年10月12日
  1. C# で引数を解析するために CommandLineParser を使用する
  2. C# で引数を解析するには、If-Else ステートメントを使用する
C# でコマンドライン引数を解析する

この記事では、C# プログラミング言語を使用してコマンドライン引数を解析する方法を紹介します。この目標を達成するために、2つのアプローチと戦略を調査します。

コマンドの標準形式は commandName -argumentName argumentValue です。ここで、commandName はコマンドの名前です。たとえば、Linux で使用されているよく知られた apt コマンドを考えてみましょう。

apt install exiftool

C# で引数を解析するために CommandLineParser を使用する

コマンドと引数を手動で解析する代わりに、CommandLineParser のようなライブラリを使用してタスクを実行できるため、心配する必要はありません。その後、あなたの主な集中力は、コマンドロジックを実行に移すために行くかもしれません。

CommandLineParser が引数を受け取り、次の方法でコマンドを実行できるようにするコードを開発する方法を示します。

static void Main(string[] args) {
  Parser.Default.ParseArguments<UpdateCommand, InstallCommand>(args).WithParsed<ICommand>(
      t => t.Execute());
}

まず、NuGet パッケージをインストールする必要があります。これは、次のコマンドを実行することで実行できます。

Install-Package CommandLineParser

コマンドがまだ存在しない場合は、コマンドの基本クラスまたはインターフェイスを作成します。一方、インターフェイスを構築すると、コードで使用できる .WithParsed<ICommand> は 1つだけになります。

public interface ICommand {
  void Execute();
}

最初に UpdateCommand を追加し、次に Verb 属性を追加する必要があります。このパラメータは、update という単語に遭遇したときに UpdateCommand オブジェクトを生成するように CommandLineParser に指示します。

[Verb("update", HelpText = "updates your system to the newest version")]
public class UpdateCommand : ICommand {
  public void Execute() {
    Console.WriteLine("Updating the system");
  }
}

この時点で InstallCommandinstall コマンドの message パラメータを入力します。直接的な結果として、Message プロパティと Option 属性​​を含めます。

この属性は、引数をプロパティに変換する手順を CommandLineParser に提供します。

[Verb("install", HelpText = "installing your software")]
public class InstallCommand : ICommand {
  [Option("message", Required = true, HelpText = "installing the program")]
  public string Message { get; set; }
  public void Execute() {
    Console.WriteLine($"Executing install for the : {Message}");
  }
}

最後に、引数を型パラメーターとして CommandLineParser に渡して解析します。

C# で引数を解析するには、If-Else ステートメントを使用する

以下は、コマンドライン引数の解析の例です。

static void Main(string[] args) {
  if (!(args.Length != 0)) {
    Console.WriteLine("arguments not correct");
    return;
  }
}

static void Main(string[] args) を読み取る行の目的は、コマンドラインから引数を取得し、それらを args 配列に保存することです。if (!(args.Length != 0)) 行は、引数の合計の長さが 0 であるかどうかをチェックします。

長さが 0 の場合、コマンドライン引数がプログラムに提供されていないことを示します。

Console.WriteLine("arguments not correct"); という行は、引数が正しくないう行ユーザーが次回正しい数の引数を入力できるように、引数が正しくないことを画面に表示します。

var c = args[0];

var c = args[0]; の行は、変数名 c を作成し、コマンドラインで渡された最初の引数を格納します。

if (c == "update") {
  update();
} else if (c == "install") {
  if (args.Length == 2)
    install(args[1]);
} else {
  Console.WriteLine("Invalid Command");
}

コマンドラインから送信される引数の先頭で、変数 c に引数 update が指定されているかどうかを判断します。答えが肯定的である場合、update() 関数が呼び出されます。

install 条件は、c 変数の先頭に install 引数が含まれているかどうかを確認し、含まれている場合は args 変数の長さを 2 と比較して、引数を 2つ持つべきかどうかを判断します。

したがって、コマンドラインから指定されたパラメータのパラメータリスト内で確認します。

args の長さが 2 の場合、パラメーターとして args[1] を使用して install() 関数を呼び出します。

else ケースは、他のケースが一致しない場合は常に実行され、その時点で Invalid Command と画面に表示されます。

static void update() {
  Console.WriteLine("updating your system");
}

update() 関数は、update が引数として送信されると、"updating your system"を出力します。

static void install(string message) {
  Console.WriteLine($"installing the program {message}");
}

install() 関数は、install が引数として送信されると、"Installing the program {message}"を出力します。

完全なソースコード:

using System;

class CommandLineParser {
  static void Main(string[] args) {
    if ((args.Length == 0)) {
      Console.WriteLine("arguments not correct");
      return;
    }
    var c = args[0];

    if (c == "update") {
      update();
    } else if (c == "install") {
      if (args.Length == 2)
        install(args[1]);
    } else {
      Console.WriteLine("Invalid Command");
    }
  }
  static void update() {
    Console.WriteLine("updating your system");
  }
  static void install(string message) {
    Console.WriteLine($"installing the program {message}");
  }
}
著者: Saad Aslam
Saad Aslam avatar Saad Aslam avatar

I'm a Flutter application developer with 1 year of professional experience in the field. I've created applications for both, android and iOS using AWS and Firebase, as the backend. I've written articles relating to the theoretical and problem-solving aspects of C, C++, and C#. I'm currently enrolled in an undergraduate program for Information Technology.

LinkedIn