2012-11-19 122 views
5

我需要將程序的功能添加到通過命令行打開程序時接受多個命名參數。即解析多個命名命令行參數

program.exe /param1=value /param2=value 

然後能夠利用這些參數作爲程序中的變量。我已經找到了幾種方法來完成這件事,但似乎無法弄清楚如何將它們放在一起。

我已經能夠通過一個命名的參數,並使用下面的代碼恢復它,而我能複製它每一個可能的命名參數,我知道不能做到這一點的方式參訪。

Dim inputArgument As String = "/input=" 
    Dim inputName As String = "" 

    For Each s As String In My.Application.CommandLineArgs 
     If s.ToLower.StartsWith(inputArgument) Then 
      inputName = s.Remove(0, inputArgument.Length) 
     End If 
    Next 

或者,我可以用

My.Application.CommandLineArgs 

得到的命令行的多個未命名參數,但是這需要所有的參數以相同的順序/格式每次進行傳遞。我需要能夠每次傳遞一個隨機子集的參數。

最終,我希望能夠做到的是將每個參數和值分開,並將其加載到多維數組中供以後使用。我知道我可以通過在「=」處分隔字符串並剝離「/」來找到一種方法,但由於我對此有點新,所以我想看看是否存在「優先處理」的交易方式有多個命名參數?

回答

6

我的首選處理方法是使用現有的庫,例如Command Line Parser Library。 (不過,在默認情況下,它採用了different input format--input=Value代替/input=value左右爲主。)

這使您不必自己編寫代碼,得到了很多的靈活性和魯棒性,簡化了代碼的優勢。

+0

這正是我一直在尋找。我真的不關心輸入格式是幹什麼用的?我還沒有分配任何東西。感謝您的快速幫助。 – scholzr

1

這是一個小功能來做你想做的事情。它允許您將所有參數存儲在結構中的名稱 - 值對中。

Module Module1 
Private Structure NameCommandLineStuct 
    Dim Name As String 
    Dim Value As String 
End Structure 
Private CommandLineArgs As New List(Of NameCommandLineStuct) 

Sub Main() 
    If ParseCommandLine() Then 
     For Each commandItem As NameCommandLineStuct In CommandLineArgs 
      Select Case commandItem.Name.ToLower 
       Case "one" 
        Console.Write(String.Format("key one is {0}", commandItem.Value)) 
       Case "two" 
        Console.Write(String.Format("key two is {0}", commandItem.Value)) 
      End Select 
     Next 
    End If 
End Sub 
Function ParseCommandLine() As Boolean 
    'step one, Do we have a command line? 
    If String.IsNullOrEmpty(Command) Then 
     'give up if we don't 
     Return False 
    End If 

    'does the command line have at least one named parameter? 
    If Not Command.Contains("/") Then 
     'give up if we don't 
     Return False 
    End If 
    'Split the command line on our slashes. 
    Dim Params As String() = Split(Command, "/") 

    'Iterate through the parameters passed 
    For Each arg As String In Params 
     'only process if the argument is not empty 
     If Not String.IsNullOrEmpty(arg) Then 
      'and contains an equal 
      If arg.Contains("=") Then 

       Dim tmp As NameCommandLineStuct 
       'find the equal sign 
       Dim idx As Integer = arg.IndexOf("=") 
       'if the equal isn't at the end of the string 
       If idx < arg.Length - 1 Then 
        'parse the name value pair 
        tmp.Name = arg.Substring(0, idx).Trim() 
        tmp.Value = arg.Substring(idx + 1).Trim() 
        'add it to the list. 
        CommandLineArgs.Add(tmp) 
       End If 
      End If 
     End If 

    Next 
    Return True 
End Function 
End Module