在 C# 中解析命令列引數

Saad Aslam 2023年1月30日 2022年7月18日
  1. C# 使用 CommandLineParser 中解析引數
  2. C# 中使用 If-Else 語句解析引數
在 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}");
    }
}
Author: 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