C#从命令行读取多个参数
如果我想这样执行,在其他语言中很常见:program.exe-u user-p password 如何在C#main()中编写此代码C#从命令行读取多个参数,c#,C#,如果我想这样执行,在其他语言中很常见:program.exe-u user-p password 如何在C#main()中编写此代码 和args数组将包含参数列表。如何使用NDesk解决此问题。选项: static void Main(string[] args) { // Loading via the command line; parse command line args string username = string.Empty; string passwor
和
args
数组将包含参数列表。如何使用NDesk解决此问题。选项
:
static void Main(string[] args)
{
// Loading via the command line; parse command line args
string username = string.Empty;
string password = string.Empty;
OptionSet CmdParser = new OptionSet
{
{ "u|username=", "Username", u => username = u },
{ "p|password=", "Password", p => password = p }
};
try
{
// Loading via the command line; parse command line arguments
List<string> unknownArgs = CmdParser.Parse(args);
if (unknownArgs.Count > 1)
{
Console.Write("Unrecognised argument in: '{0}'", string.Join(" ", unknownArgs));
}
}
catch (OptionException ex)
{
Console.WriteLine(ex.Message);
}
}
static void Main(字符串[]args)
{
//通过命令行加载;解析命令行参数
string username=string.Empty;
字符串密码=string.Empty;
OptionSet CmdParser=新建OptionSet
{
{“u | username=”,“username”,u=>username=u},
{“p | password=”,“password”,p=>password=p}
};
尝试
{
//通过命令行加载;解析命令行参数
List unknownArgs=CmdParser.Parse(args);
如果(未知数>1)
{
Write(“{0}”中无法识别的参数,string.Join(“,unknownArgs));
}
}
捕获(OptionException例外)
{
控制台写入线(例如消息);
}
}
这是一个贫乏的实现,和其他已经回复的实现一样,我建议您使用nuget包来完成这项工作
下面是我以前使用过的2个(我没有测试这些实现,但它们应该可以让您达到80%的效果):
对于更面向功能的方法,可以安装最新版本的命令行解析器
Install-Package CommandLineParser -pre
定义选项类
class Options
{
[Option('u', "user", Required = true, HelpText = "username")]
public string UserName { get; set; }
[Option('p', "password", Required = true, HelpText = "password")]
public string Password { get; set; }
[Value(0)]
public IEnumerable<string> StringSequence { get; set; }
}
类选项
{
[选项('u','user',Required=true,HelpText=“username”)]
公共字符串用户名{get;set;}
[选项('p','password',Required=true,HelpText=“password”)]
公共字符串密码{get;set;}
[价值(0)]
公共IEnumerable StringSequence{get;set;}
}
并解析命令行
class Program
{
static int Main(string[] args)
{
var parser = new Parser(settings =>
{
settings.CaseSensitive = false;
settings.HelpWriter = Console.Error;
settings.IgnoreUnknownArguments = false;
});
var result = parser.ParseArguments<Options>(args);
var exitCode = result
.MapResult(
options =>
{
if (options.StringSequence.Count() > 0)
{
Console.WriteLine("unbound params: " +
String.Join(",", options.StringSequence)
);
return 1;
}
Console.WriteLine("Hi " + options.UserName + ", your password is");
Console.WriteLine(options.Password);
return 0;
},
errors =>
{
Console.WriteLine(
String.Join(",",
errors.Select(x => x.ToString())
)
);
return 1;
});
return exitCode;
}
}
类程序
{
静态int Main(字符串[]args)
{
var解析器=新解析器(设置=>
{
settings.CaseSensitive=false;
settings.HelpWriter=Console.Error;
settings.IgnoreUnknownArguments=false;
});
var result=parser.ParseArguments(args);
var exitCode=结果
.MapResult(
选项=>
{
if(options.StringSequence.Count()>0)
{
Console.WriteLine(“未绑定的参数:”+
String.Join(“,”选项.StringSequence)
);
返回1;
}
Console.WriteLine(“Hi”+options.UserName+”,您的密码是“);
Console.WriteLine(选项.密码);
返回0;
},
错误=>
{
控制台写入线(
String.Join(“,”,
错误。选择(x=>x.ToString())
)
);
返回1;
});
返回exitCode;
}
}
为了完整起见,完整的方法签名是static void Main(string[]args)
使用现有的命令行解析器另一个是:int days?不是字符串。@JirongHu不知道你的意思。是否要捕获整数参数?
// Define a class to receive parsed values
class Options {
[Option('u', "user", Required=true, HelpText="username")]
public string UserName { get; set; }
[Option('p', "password", Required=true, HelpText="password")]
public string Password { get; set; }
[ParserState]
public IParserState LastParserState { get; set; }
[HelpOption]
public string GetUsage() {
return HelpText.AutoBuild(this,
(HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
}
}
// Consume them
static void Main(string[] args) {
var options = new Options();
if (CommandLine.Parser.Default.ParseArguments(args, options))
{
// Values are available here
Console.WriteLine($"UserName:{options.UserName}");
}
}
Install-Package CommandLineParser -pre
class Options
{
[Option('u', "user", Required = true, HelpText = "username")]
public string UserName { get; set; }
[Option('p', "password", Required = true, HelpText = "password")]
public string Password { get; set; }
[Value(0)]
public IEnumerable<string> StringSequence { get; set; }
}
class Program
{
static int Main(string[] args)
{
var parser = new Parser(settings =>
{
settings.CaseSensitive = false;
settings.HelpWriter = Console.Error;
settings.IgnoreUnknownArguments = false;
});
var result = parser.ParseArguments<Options>(args);
var exitCode = result
.MapResult(
options =>
{
if (options.StringSequence.Count() > 0)
{
Console.WriteLine("unbound params: " +
String.Join(",", options.StringSequence)
);
return 1;
}
Console.WriteLine("Hi " + options.UserName + ", your password is");
Console.WriteLine(options.Password);
return 0;
},
errors =>
{
Console.WriteLine(
String.Join(",",
errors.Select(x => x.ToString())
)
);
return 1;
});
return exitCode;
}
}