【问题标题】:read command line switch读取命令行开关
【发布时间】:2012-04-02 07:55:20
【问题描述】:

我正在尝试在 C# 应用程序中读取用户参数。我知道如何根据位置来阅读它们

string[] args = Environment.GetCommandLineArgs();

但我想从开关中读取它们,例如

app.exe /f /d:foo

我真的很难找到有关这样做的任何信息...

【问题讨论】:

  • 不幸的是,C# 没有提供更多信息,而只是将命令行参数列表作为字符串。它甚至不包括 .exe 名称。

标签: c# .net


【解决方案1】:
void Main(string[] args )
{
    foreach( var arg in args )
    {
        // process each arg if needed, i.e., 
        // remove '-', '/', uppercase, whatever
        switch(arg)
        {
            case "blah":
            // ...
        }
    }
}

为此目的确实存在图书馆,这使整个过程变得更加容易,但如果这是一个一次性应用程序,它可能不值得。取决于你的命令行参数有多复杂。

【讨论】:

  • @MTeck - Mono.Options 是此类库的一个很好的轻量级示例。
【解决方案2】:

嗯,基本上你已经完成了。 处理您从框架获得的string[] 数组并完成。 没有内置方法可以实现您的要求。

喜欢第3方解决方案的可以看看

C#/.NET Command Line Arguments Parser

【讨论】:

    【解决方案3】:

    我是一个可能满足您需求的开源 .NET 命令行库的作者:C# CLI

    您可能还想阅读this question 以获得其他建议。

    【讨论】:

      【解决方案4】:

      我相信您必须推出自己的实施方案。在编写单元测试来评估新方法之后,我可能会开始思考......

      foreach (string arg in args)
      {
          flagF = flagF || arg == "/f"; // assuming F is boolean
          flagD = flagD ?? (arg.Substring(0,3) =="/d:" ? arg.Substring(3) : null);
      }
      

      【讨论】:

      • flagF 应该被初始化为 false,然后执行 flagF |= arg == "/f"; 以便一旦它变为 true,它就保持为 true。按照你现在的方式,flagF 始终为真。
      • 那么对于 flagD,在您的 () 中将 2 更改为 3,因为 "/d:" 是 3 个字符。
      • @ChuckSavage 谢谢;无论如何,代码都传达了这个想法,即使是仓促编写的:-)。现在更正。
      【解决方案5】:

      你为什么不像这样解析传递的参数数组并根据它们采取行动

      foreach (string arg in args)
      {
          switch (arg.Substring(0, 2).ToUpper())
          {
              case "/F":
                  // process argument...
                  break;
              case "/Z":
                  // process arg...
                  break;
              case "/D":
                  paramD = arg.Substring(3);
                  break;
              default:
                  // do other stuff...
                  break;
          }
      }
      

      【讨论】:

        【解决方案6】:

        怎么样,

        // first is exe of executing program
        string[] args = Environment.CommandLine.Split('/').Skip(1).ToArray();
        foreach (string arg in args)
        {
            string value = arg.Trim();
            switch (value)
            {
                case "f":
                    //...
                    continue;
            }
            if (value.StartsWith("d:"))
            {
                value = value.Substring(2);
                // ...
                continue;
            }
        }
        

        【讨论】:

          【解决方案7】:

          我已经看到了一些通过 args 字符串集合循环的答案 - 问题是您在按下要查找的开关后需要下一个项目。我使用集合的数组索引来获取下一项。

          在我的示例中,我正在寻找一个服务器和一个端口 /S 和 /P。我希望这可以帮助某人:

                  var server = string.Empty;
                  var port = string.Empty;
          
                  for(var x = 0; x < args.Count(); x++)
                  {
                      switch (args[x].Trim().ToUpper())
                      {
                          case "/S":
                              server = args[x + 1];
                              break;
                          case "/P":
                              port = args[x + 1];
                              break;                                        
                      }
                  }
          

          【讨论】:

          • 在将值设置为下一个参数后,您可能希望推进 x。否则,您将不必要地处理该 arg: server = args[++x];
          • ...但是您的解决方案没有捕捉到提到的/d:foo 用例
          【解决方案8】:

          【讨论】:

            猜你喜欢
            • 2021-10-20
            • 2011-05-22
            • 2018-04-26
            • 1970-01-01
            • 1970-01-01
            • 2019-02-07
            • 1970-01-01
            • 2014-08-20
            • 1970-01-01
            相关资源
            最近更新 更多