HOWTO · Csharp

在 C# 中解析命令列引數

在這篇文章中,我們將研究在 C# 程式碼中解析命令列引數的各種技術。

這篇文章將介紹使用 C# 程式語言解析命令列引數。我們將研究兩種方法和策略來完成這一目標。

命令的標準格式是 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>

public interface ICommand {
  void Execute();
}

必須先新增 UpdateCommand,然後新增 Verb 屬性。此引數指示 CommandLineParser 在遇到單詞 update 時生成一個 UpdateCommand 物件。

[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]; line 建立變數名 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。

因此,我們通過命令列驗證引數列表裡面給它的引數。

如果 args 的長度為 2,它會呼叫 install() 函式,並將 args[1] 作為引數。

只要其他情況都不匹配,就會執行 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}");
  }
}