2010-07-21 2 views
4

Многие утилиты командной строки используют параметры, такие как:Как включить параметры опции «/ x» в консольное приложение .NET?

gacutil /i MyDLL.dll 

или

regasm /tlb:MyDll.tlb MyDll.dll 

Как настроить консольного приложения .NET, чтобы взять в качестве аргументов командной строки и, во-вторых, как можете ли вы эмулировать параметры «опции», такие как /i и /tlb: в соответствующих примерах выше?

+0

возможно дубликат (http://stackoverflow.com/questions/491595/best-way- [Лучший способ для разбора аргументов командной строки в C#?] to-parse-command-line-arguments-in-c) – Oliver

ответ

6

Вы объявляете параметр для главного метода:

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 
    } 
} 
+0

Это оказалось для моего простого решения, но я немного изменил инструкцию switch (и находится в VB.NET): 'cmd.Substring (1, cmd. Длина - 1) .Split (New Char() {":" c}, StringSplitOptions.RemoveEmptyEntries) (0) .ToLower() '. Таким образом, я могу использовать полное слово в качестве параметра параметра. –

1

Вы просто сделать ваш метод Main принимают параметр string[]:

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

Это до вас, чтобы проанализировать аргументы надлежащим образом, в том, что нет ничего встраивается в рамках, чтобы сделать это. Возможно, вам захочется взглянуть на библиотеку NDesk.Options. (Есть много других, но это, кажется, быть популярным один. Я не могу сказать, что я использовал это сам, заметьте.)

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

Точка входа приложения могут быть объявлены :

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

Это дает вам массив строк, в которых каждый элемент является одним из параметров командной строки. Как только у вас получится, это просто вопрос разбора строк в массиве, чтобы настроить параметры в вашем приложении.

1

Вам необходимо обработать это самостоятельно (или использовать существующую библиотеку) для работы с параметрами командной строки. См. MSDN (Main() и аргументы командной строки).

Одна хорошая библиотека: Mono.Options, другой я использовал commandline.

В вашем консольном приложении у вас будет основной метод, который принимает параметр string[] (по умолчанию и соглашение), это называется args. Этот массив содержит все параметры командной строки. Затем вы сможете разобрать их.

+0

+1 для командной строки. Очень простой в использовании, доступный через NuGet, и намного приятнее, чем сканирование собственного кода. – mhenry1384

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. 
    } 
Смежные вопросы