Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从命令行读取多个参数_C# - Fatal编程技术网

C#从命令行读取多个参数

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

如果我想这样执行,在其他语言中很常见: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 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;
    }
}