HOWTO · Csharp

C#에서 명령줄 인수 구문 분석

이 게시물에서는 C# 코드에서 명령줄 매개 변수를 구문 분석하는 다양한 기술을 살펴봅니다.

이 페이지의 내용

이 게시물은 C# 프로그래밍 언어를 사용하여 명령줄 인수를 구문 분석하는 방법을 소개합니다. 우리는 이 목표를 완료하기 위해 두 가지 접근 방식과 전략을 조사할 것입니다.

명령의 표준 형식은 commandName -argumentName argumentValue이며, 여기서 commandName은 명령 이름입니다. 예를 들어 Linux에서 사용되는 잘 알려진 apt 명령을 살펴보겠습니다.

apt install exiftool

CommandLineParser를 사용하여 C#의 인수 구문 분석

명령과 인수를 수동으로 구문 분석하는 대신 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 속성을 추가해야 합니다. 이 매개변수는 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에 인수를 유형 매개변수로 전달하여 구문 분석합니다.

If-Else 문을 사용하여 C#의 인수 구문 분석

다음은 명령줄 인수를 구문 분석하는 예입니다.

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이면 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}");
  }
}