命令行解析单个命令上的多个动词

时间:2018-05-18 17:10:06

标签: c# console-application command-line-parser

我正在编写一个控制台应用程序,我们必须更新已安装应用程序上的多个连接字符串。我使用了“ CommandLineParser ”库以及“动词”功能。我的要求是使用单个命令行来传递不同的连接字符串值。

Example:
 Installer.exe conn1 -sservername -uusername -ppassword conn2 -sservername -uusername -ppassword

而在“CommandLineParser”中却无法完成?还有其他我可以使用的图书馆吗?

我尝试了以下软件包,

  1. CommandLineArgumentsParser
  2. CommandLineParser
  3. CLAP

3 个答案:

答案 0 :(得分:1)

您可以使用NDesk.Options进行模拟,但您必须自己编写一些验证码。

NDesk.Options中,您可以为默认选项注册处理程序("<>")。 该处理程序将针对您示例中的每个连接运行。每次遇到默认选项的值时,都可以创建连接设置对象,并在提供常规选项时填写最新的对象。

public class ConnectionListParser : OptionSet
{
    public class ConnectionSettings
    {
        public string Name { get; set; }
        public string Servername { get; set; }
        public string Username { get; set; }
        public string Password { get; set; }
    }

    public List<ConnectionSettings> Connections {get;} = new List<ConnectionSettings>();        

    public ConnectionListParser() {     
        Add("<>", x => {                        
            Connections.Add(new ConnectionSettings() {
                Name = x
            });                             
        });

        Add("s:", x => Connections.Last().Servername = x);
        Add("u:", x => Connections.Last().Username = x);
        Add("p:", x => Connections.Last().Password = x);
    }
}

用法:

var opts = new ConnectionListParser();
var remain = opts.Parse("conn1 -sservername1 -uusername1 -ppassword1 conn2 -sservername2 -uusername2 -ppassword2".Split(' '));
// or opts.Parse(args) when you have actual command line arguments to parse
foreach(var c in opts.Connections) {        
    Console.WriteLine($"Connection '{c.Name}': Username={c.Username};Password={c.Password};Servername={c.Servername}");
}

答案 1 :(得分:1)

您是否可以使用简单的算法解析命令行参数,如下所示?

class ConnectionString
{
  public string Conn { get; set; }
  public string Server { get; set; }
  public string user { get; set; }
  public string pass { get; set; }
}

class MainClass
{
  static int Main(string[] args)
  {
    // Test if input arguments were supplied:
    if (args.Length == 0)
    {
      System.Console.WriteLine("No parameters specified.");
      return 1;
    }

    List<ConnectionString> connections = new List<ConnectionString>():
        ConnectionString connec = null;
    for (int i = 0; i < args.Length; i++)
    {
      if (args[i].StartsWith("-s"))
      {
        if (connec != null)
        {
          connec.Server = args[i].Substring(2);
        }
        continue;
      }
      if (args[i].StartsWith("-u"))
      {
        if (connec != null)
        {
          connec.user = args[i].Substring(2);
        }
        continue;
      }
      if (args[i].StartsWith("-p"))
      {
        if (connec != null)
        {
          connec.pass = args[i].Substring(2);
        }
        continue;
      }
      connec = new ConnectionString();
      connec.Conn = args[i];

      connections.Add(connec);
    }

    // Do What you need to do from here

    return 0;
  }
}

答案 2 :(得分:0)

CommandLineUtils具有此功能, 参见fake-git example

另一种可能性是官方System.CommandLine,请参见wiki example