如果在命令行中指定了help选项,如何终止应用程序?

时间:2017-02-26 09:04:01

标签: c# command-line .net-core

这个问题是关于一个类的一起工作在.net核心中提供丰富的命令行解析经验。主要班级是CommandLineApplicationThis是一篇走过主要设施的文章。

这就是配置显示自动生成帮助的帮助选项的方法。

cla.HelpOption("-? | -h | --help");

如果在命令行的任何地方找到帮助选项,我希望我的应用程序终止,而不是继续运行。但我找不到实现这个目标的好方法。我当然可以自己解析这些论点,以确定是否指定了该选项,但这不是这个工具的全部要点吗?

以下是我使用的示例代码:

public class Config
{
    public string Option1 {get; set;}
}

public class CommandLine
{
    public static void ApplyCommandLineArguments(string[] args, Config config)
    {
        CommandLineApplication cla = new CommandLineApplication(false);
        CommandOption option1 = cla.Option(
            "-o | --option1",
            "Set this option to specify option1",
            CommandOptionType.SingleValue
        );
        cla.HelpOption("-? | -h | --help");
        cla.OnExecute(() =>
        {
            if (option1.HasValue())
            {
                config.Option1 = option1.Value();
            }
            return 0;
        });

        try
        {
            cla.Execute(args);
        }
        catch (CommandParsingException ex)
        {
            Console.WriteLine(ex.Message);
            cla.ShowHelp();
        }
    }
}

然后在Main方法中:

Config config = new Config();
CommandLine.ApplyCommandLineArguments(args, config);
// I want to exit here if user specified the help option anywhere on the command line.
Console.WriteLine("Hello World!");

1 个答案:

答案 0 :(得分:2)

如果找到了帮助选项,则cla.Execute实际上不会运行您的OnExecute回调,只会返回0.您可以通过从OnExecute回调中返回非零值来使用它,像这样:

public class CommandLine
{
    // returns true if parse was successful and you can proceed. Returns false if you can terminate
    public static bool ApplyCommandLineArguments(string[] args, Config config)
    {
        CommandLineApplication cla = new CommandLineApplication(false);
        CommandOption option1 = cla.Option(
            "-o | --option1",
            "Set this option to specify option1",
            CommandOptionType.SingleValue
        );
        cla.HelpOption("-? | -h | --help");
        cla.OnExecute(() =>
        {
            if (option1.HasValue()) {
                config.Option1 = option1.Value();
            }
            // non-zero value
            return 1;
        });

        try {
            int result = cla.Execute(args);
            // check result
            return result > 0;
        }
        catch (CommandParsingException ex) {
            Console.WriteLine(ex.Message);
            cla.ShowHelp();
            return false;
        }
    }
}

public static void Main(string[] args)
    {
        Config config = new Config();
        if (!CommandLine.ApplyCommandLineArguments(args, config)) {
            return;
        }

        // I want to exit here if user specified the help option anywhere on the command line.
        Console.WriteLine("Hello World!");
        Console.ReadKey();
    }