1

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

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

而在“CommandLineParser”中它不能完成?还有其他我可以使用的库吗?

我尝试了以下软件包,

  1. 命令行参数解析器
  2. 命令行解析器
4

3 回答 3

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;
  }
}
于 2018-05-18T19:12:31.567 回答
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}");
}
于 2018-05-18T18:49:19.240 回答
0

CommandLineUtils具有此功能,请参阅fake-git 示例

另一种可能性是官方System.CommandLine,请参阅wiki 示例

于 2020-08-03T19:38:01.010 回答