C# 单个命令上多个谓词的命令行分析
我正在编写一个控制台应用程序,其中必须更新已安装应用程序上的多连接字符串。我使用了带有动词功能的“CommandLineParser”库。我的要求是使用单个命令行传递不同的连接字符串值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”中,它不能完成吗?还有别的图书馆我可以利用吗 我试过以下的
Example:
Installer.exe conn1 -sservername -uusername -ppassword conn2 -sservername -uusername -ppassword
而在“CommandLineParser”中,它不能完成吗?还有别的图书馆我可以利用吗
我试过以下的软件包
您可以使用来模拟这一点,尽管您必须自己编写一些验证代码 在
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;
}
}