[C#] C #에서 명령 줄 인수를 구문 분석하는 가장 좋은 방법은 무엇입니까? [닫은]

매개 변수를 사용하는 콘솔 응용 프로그램을 빌드 할 때에 전달 된 인수를 사용할 수 있습니다 Main(string[] args).

과거에는 단순히 해당 배열을 인덱싱 / 루프하고 몇 가지 정규 표현식을 수행하여 값을 추출했습니다. 그러나 명령이 더 복잡해지면 구문 분석이 매우 어려워 질 수 있습니다.

그래서 나는 관심이 있습니다 :

  • 사용하는 라이브러리
  • 사용하는 패턴

명령이 항상 여기에 답변 된 것과 같은 공통 표준을 준수한다고 가정 하십시오 .



답변

NDesk.Options ( Documentation ) 및 / 또는 Mono.Options (동일한 API, 다른 네임 스페이스)를 사용하는 것이 좋습니다 . 설명서 :

bool show_help = false;
List<string> names = new List<string> ();
int repeat = 1;

var p = new OptionSet () {
    { "n|name=", "the {NAME} of someone to greet.",
       v => names.Add (v) },
    { "r|repeat=",
       "the number of {TIMES} to repeat the greeting.\n" +
          "this must be an integer.",
        (int v) => repeat = v },
    { "v", "increase debug message verbosity",
       v => { if (v != null) ++verbosity; } },
    { "h|help",  "show this message and exit",
       v => show_help = v != null },
};

List<string> extra;
try {
    extra = p.Parse (args);
}
catch (OptionException e) {
    Console.Write ("greet: ");
    Console.WriteLine (e.Message);
    Console.WriteLine ("Try `greet --help' for more information.");
    return;
}


답변

나는 커맨드 라인 파서 라이브러리 ( http://commandline.codeplex.com/ )를 정말 좋아합니다 . 속성을 통해 매개 변수를 설정하는 매우 간단하고 우아한 방법이 있습니다.

class Options
{
    [Option("i", "input", Required = true, HelpText = "Input file to read.")]
    public string InputFile { get; set; }

    [Option(null, "length", HelpText = "The maximum number of bytes to process.")]
    public int MaximumLenght { get; set; }

    [Option("v", null, HelpText = "Print details during execution.")]
    public bool Verbose { get; set; }

    [HelpOption(HelpText = "Display this help screen.")]
    public string GetUsage()
    {
        var usage = new StringBuilder();
        usage.AppendLine("Quickstart Application 1.0");
        usage.AppendLine("Read user manual for usage instructions...");
        return usage.ToString();
    }
}


답변

WPF TestApi 라이브러리는 C #을 개발을위한 좋은 명령 줄 파서 중 하나와 함께 제공됩니다. API에 대한 Ivo Manolov의 블로그 에서 살펴 보는 것이 좋습니다 .

// EXAMPLE #2:
// Sample for parsing the following command-line:
// Test.exe /verbose /runId=10
// This sample declares a class in which the strongly-
// typed arguments are populated
public class CommandLineArguments
{
   bool? Verbose { get; set; }
   int? RunId { get; set; }
}

CommandLineArguments a = new CommandLineArguments();
CommandLineParser.ParseArguments(args, a);


답변

http://github.com/mono/mono/tree/master/mcs/class/Mono.Options/를 보십시오


답변

모두가 자신의 애완 동물 명령 줄 파서를 가지고있는 것처럼 보입니다.

http://bizark.codeplex.com/

이 라이브러리에는 명령 줄 의 값으로 클래스를 초기화 하는 명령 줄 파서 가 포함되어 있습니다 . 그것은 많은 기능을 가지고 있습니다 (수년 동안 그것을 구축해 왔습니다).

로부터 문서

BizArk 프레임 워크의 명령 줄 구문 분석에는 다음과 같은 주요 기능이 있습니다.

  • 자동 초기화 : 클래스 속성은 명령 줄 인수를 기반으로 자동 설정됩니다.
  • 기본 속성 : 속성 이름을 지정하지 않고 값을 보냅니다.
  • 값 변환 : BizArk에 포함 된 강력한 ConvertEx 클래스를 사용하여 값을 적절한 유형으로 변환합니다.
  • 부울 플래그 : 단순히 인수 (예 : true, / b, false / b-)를 사용하거나 true / false, yes / no 등의 값을 추가하여 플래그를 지정할 수 있습니다.
  • 인수 배열 : 명령 줄 이름 뒤에 여러 값을 추가하면 배열로 정의 된 속성을 설정할 수 있습니다. 예를 들어, / x 1 2 3은 x를 {1, 2, 3} 배열로 채 웁니다 (x가 정수 배열로 정의되었다고 가정).
  • 명령 줄 별칭 : 속성은 여러 명령 줄 별칭을 지원할 수 있습니다. 예를 들어, 도움말은?를 사용합니다.
  • 부분 이름 인식 : 전체 이름이나 별칭을 철자 할 필요는 없습니다. 파서가 속성 / 별칭을 다른 속성과 명확하게 구분할 수있을 정도로만 철자를 입력하십시오.
  • ClickOnce 지원 : ClickOnce 배포 응용 프로그램의 URL에서 쿼리 문자열로 지정된 경우에도 속성을 초기화 할 수 있습니다. 명령 줄 초기화 방법은 ClickOnce로 실행 중인지 여부를 감지하므로 사용시 코드를 변경할 필요가 없습니다.
  • 자동으로 /? 도움말 : 콘솔 너비를 고려한 멋진 형식이 포함되어 있습니다.
  • 명령 줄 인수를 파일에로드 / 저장 : 여러 번 실행하려는 크고 복잡한 명령 줄 인수가 여러 개인 경우에 특히 유용합니다.

답변

나는 C # 명령 줄 인수 파서를 잠시 썼다. 그것에서 : http://www.codeplex.com/CommandLineArguments


답변

CLAP (명령 줄 인수 파서)에는 유용한 API가 있으며 훌륭하게 문서화되어 있습니다. 매개 변수에 주석을 달아 메소드를 작성합니다. https://github.com/adrianaisemberg/CLAP