读取命令行开关

时间:2012-03-16 18:52:12

标签: c# .net

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

来阅读它们
string[] args = Environment.GetCommandLineArgs();

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

app.exe /f /d:foo

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

8 个答案:

答案 0 :(得分:25)

为什么不解析传递的参数数组并根据它们进行操作,比如

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;
    }
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

怎么样,

// 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;
    }
}

答案 3 :(得分:3)

我已经看到了几个循环遍历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;                                        
            }
        }

答案 4 :(得分:0)

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

像第三方解决方案可以看看

C#/.NET Command Line Arguments Parser

答案 5 :(得分:0)

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

您可能还想阅读this问题以获取其他建议。

答案 6 :(得分:0)

我相信你必须推出自己的实现。在编写单元测试以评估新方法之后,我可能会开始考虑......

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

答案 7 :(得分:0)