如何将“/ x”选项参数合并到.NET控制台应用程序中?

时间:2010-07-21 13:22:37

标签: c# .net vb.net console-application

许多命令行实用程序使用参数,例如:

gacutil /i MyDLL.dll

regasm /tlb:MyDll.tlb MyDll.dll

如何设置.NET控制台应用程序以接收命令行参数,其次,如何在上面的相应示例中模拟处理“{option}”参数,如/i/tlb:

7 个答案:

答案 0 :(得分:7)

您为Main方法声明了一个参数:

public static void Main(string[] args)

现在你有一个数组,第一个例子包含:

args[0] = "/i"
args[1] = "MyDLL.dll"

您只需要解析字符串以确定参数的含义。有点像:

foreach (string cmd in args) {
  if (cmd.StartsWith("/")) {
    switch (cmd.Substring(1)) {
      case "i":
        // handle /i parameter
        break;
      // some more options...
      default:
        // unknown parameter
        break;
    }
  } else {
    // cmd is the filename
  }
}

答案 1 :(得分:5)

答案 2 :(得分:1)

您只需使用Main方法获取string[]参数:

class Test
{
    static void Main(string[] args)
    {
        foreach (string arg in args)
        {
            Console.WriteLine(arg);
        }
    }
}

由您来适当地解析参数,因为框架中没有任何内容可以做到这一点。您可能希望查看NDesk.Options库。 (还有很多其他的,但这似乎很受欢迎。我不能说我自己也用过它,请注意。)

答案 3 :(得分:1)

您需要自己处理(或使用现有库)来处理命令行参数。请参阅MSDN(Main()和命令行参数)。

一个好的库是Mono.Options,另一个我使用的是commandline

在您的控制台应用程序中,您将拥有一个main方法,该方法采用string[]参数(默认情况下为约定),此参数名为args。此数组包含所有命令行参数。然后你可以解析它们。

答案 4 :(得分:0)

This page有一个VB.NET示例

Sub Main()
    Dim arrArgs() A s String = Command.Split(“,”)
    Dim i As Integer
    Console.Write(vbNewLine & vbNewLine)
    If arrArgs(0) <> Nothing Then
        For i = LBound(arrArgs) To UBound(arrArgs)
            Console.Write(“Parameter “ & i & ” is “ & arrArgs(i) & vbNewLine)
        Next
    Else
        Console.Write(“No parameter passed”)
    End If
    Console.Write(vbNewLine & vbNewLine)
End Sub

This MSDN page有一个C#示例:

static int Main(string[] args)
{
    // Test if input arguments were supplied:
    if (args.Length == 0)
    {
        System.Console.WriteLine("Please enter a numeric argument.");
        System.Console.WriteLine("Usage: Factorial <num>");
        return 1;
    }

    // Try to convert the input arguments to numbers. This will throw
    // an exception if the argument is not a number.
    // num = int.Parse(args[0]);
    int num;
    bool test = int.TryParse(args[0], out num);
    if (test == false)
    {
        System.Console.WriteLine("Please enter a numeric argument.");
        System.Console.WriteLine("Usage: Factorial <num>");
        return 1;
    }
.....

答案 5 :(得分:0)

应用程序的入口点可以声明为:

static void Main (string[] args) { ... }

这为您提供了一个字符串数组,其中每个元素都是命令行参数之一。一旦你得到它,只需解析数组中的字符串来配置你的应用程序中的选项。

答案 6 :(得分:0)

我倾向于为此编写自己的逻辑,因为我通常不想为我的控制台应用程序创建额外的外部依赖项。

下面是我编写的一些代码,用于使用命令行参数填充一些变量。此代码旨在支持使用“/”或“ - ”为参数名称添加前缀,并且如果参数采用值(即它不是标志),则支持将值与名称分隔为“:”或“”。

请原谅缺乏评论;)

    static void Main(string[] args)
    {
        string directory = null;
        string filePattern = null;
        string sourceDirectory = null;
        string targetDirectory = null;
        List<string> version = null;
        string action = null;
        bool showHelp = false;

        for (int i = 0; i < args.Length; i++)
        {
            string parameterName;
            int colonIndex = args[i].IndexOf(':');
            if (colonIndex >= 0)
                parameterName = args[i].Substring(0, colonIndex);
            else
                parameterName = args[i];
            switch (parameterName.ToLower())
            {
                case "-dir":
                case "/dir":
                    if (colonIndex >= 0)
                    {
                        int valueStartIndex = colonIndex + 1;
                        directory = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
                    }
                    else
                    {
                        i++;
                        if (i < args.Length)
                        {
                            directory = args[i];
                        }
                        else
                        {
                            System.Console.WriteLine("Expected a directory to be specified with the dir parameter.");
                        }
                    }
                    break;
                case "-sourcedir":
                case "/sourcedir":
                    if (colonIndex >= 0)
                    {
                        int valueStartIndex = colonIndex + 1;
                        sourceDirectory = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
                    }
                    else
                    {
                        i++;
                        if (i < args.Length)
                        {
                            sourceDirectory = args[i];
                        }
                        else
                        {
                            System.Console.WriteLine("Expected a directory to be specified with the sourcedir parameter.");
                        }
                    }
                    break;
                case "-targetdir":
                case "/targetdir":
                    if (colonIndex >= 0)
                    {
                        int valueStartIndex = colonIndex + 1;
                        targetDirectory = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
                    }
                    else
                    {
                        i++;
                        if (i < args.Length)
                        {
                            targetDirectory = args[i];
                        }
                        else
                        {
                            System.Console.WriteLine("Expected a directory to be specified with the targetdir parameter.");
                        }
                    }
                    break;
                case "-file":
                case "/file":
                    if (colonIndex >= 0)
                    {
                        int valueStartIndex = colonIndex + 1;
                        filePattern = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
                    }
                    else
                    {
                        i++;
                        if (i < args.Length)
                        {
                            filePattern = args[i];
                        }
                        else
                        {
                            System.Console.WriteLine("Expected a file pattern to be specified with the file parameter.");
                            return;
                        }
                    }
                    break;
                case "-action":
                case "/action":
                    if (colonIndex >= 0)
                    {
                        int valueStartIndex = colonIndex + 1;
                        action = args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex);
                    }
                    else
                    {
                        i++;
                        if (i < args.Length)
                        {
                            action = args[i];
                        }
                        else
                        {
                            System.Console.WriteLine("Expected an action to be specified with the action parameter.");
                            return;
                        }
                    }
                    break;
                case "-version":
                case "/version":
                    if (version == null)
                        version = new List<string>();
                    if (colonIndex >= 0)
                    {
                        int valueStartIndex = colonIndex + 1;
                        version.Add(args[i].Substring(valueStartIndex, args[i].Length - valueStartIndex));
                    }
                    else
                    {
                        i++;
                        if (i < args.Length)
                        {
                            version.Add(args[i]);
                        }
                        else
                        {
                            System.Console.WriteLine("Expected a version to be specified with the version parameter.");
                            return;
                        }
                    }
                    break;
                case "-?":
                case "/?":
                case "-help":
                case "/help":
                    showHelp = true;
                    break;
                default:
                    System.Console.WriteLine("Unrecognized parameter \"{0}\".", parameterName);
                    return;
            }
        }

        // At this point, all of the command line arguments have been read
        // and used to populate the variables that I defined at the top.
        // The rest of my application will work with the variables
        // and will not reference to args array again.
    }