C# 单个命令上多个谓词的命令行分析

C# 单个命令上多个谓词的命令行分析,c#,console-application,command-line-parser,C#,Console Application,Command Line Parser,我正在编写一个控制台应用程序,其中必须更新已安装应用程序上的多连接字符串。我使用了带有动词功能的“CommandLineParser”库。我的要求是使用单个命令行传递不同的连接字符串值 Example: Installer.exe conn1 -sservername -uusername -ppassword conn2 -sservername -uusername -ppassword 而在“CommandLineParser”中,它不能完成吗?还有别的图书馆我可以利用吗 我试过以下的

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

Example:
 Installer.exe conn1 -sservername -uusername -ppassword conn2 -sservername -uusername -ppassword
而在“CommandLineParser”中,它不能完成吗?还有别的图书馆我可以利用吗

我试过以下的软件包

  • 命令行argumentsparser
  • 命令行分析器
  • 拍手

  • 您可以使用来模拟这一点,尽管您必须自己编写一些验证代码

    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);
        }
    }
    

    你不能用下面的简单算法来解析命令行参数吗

    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;
      }
    }
    
    类连接字符串
    {
    公共字符串Conn{get;set;}
    公共字符串服务器{get;set;}
    公共字符串用户{get;set;}
    公共字符串传递{get;set;}
    }
    类主类
    {
    静态int Main(字符串[]args)
    {
    //测试是否提供了输入参数:
    如果(args.Length==0)
    {
    System.Console.WriteLine(“未指定参数”);
    返回1;
    }
    列表连接=新列表():
    ConnectionString connec=null;
    for(int i=0;i
    具有此功能, 看


    另一种可能是官方的,请参见

    可能只是将多个值发送到一个参数,用一些众所周知的分号(如逗号或分号)分隔,然后在客户端解析该参数:
    Installer.exe-sservername“serverOne;serverTwo”-uusername“userOne;userTwo”-ppassword“passOne;passTwo”
    抱歉,我忘了提这个。所有这些参数都是可选的。他们可以更改conn2密码。这就是我想要的。谢谢你,格努德。是否也可以传递appsettings值?@Raajkumar“appsettings值”是什么意思?这意味着,除了传递连接字符串参数外,我还想传递配置值,以便可以更新app.config的appsettings部分。如果要覆盖该值,请确定。但实际上,根据命令行标志更改app.config听起来是个可怕的想法。请不要那样做,好的。知道了。我们当前的环境有300多台机器,其中每一组机器都应该配置为指向一个特定的URL。那么推荐的方法是什么呢?这就是我们目前正在使用的方法。我在找一个有更多选择的图书馆。更多选择做什么?我的版本支持您提到的可选参数。如果您需要更多,那么您需要从一开始就更加明确您的需求,以便我们能够更好地帮助您:)我的意思是在同一命令行中传递多个连接字符串和应用程序设置值。我一直在寻找更好的可行的解决方案。据我所知,我编写的代码示例应该涵盖这一点。所以我肯定错过了其他的东西。好了,现在更清楚了。这最后两个参数会干扰你能找到的几乎所有算法。我认为你也应该为这些定义一个设置。例如-rsomeurl-esomeurl.com/api/someendpoint,我不知道如何将它们与连接字符串区分开来。
    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;
      }
    }