解析多个命名的命令行参数

时间:2012-11-19 22:47:48

标签: vb.net command-line

我需要添加程序的功能,以便在通过命令行打开程序时接受多个命名参数。即

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

但是这要求每次都以相同的顺序/格式传递参数。我需要每次能够传递一个随机的参数子集。

最终,我希望能够做的是将每个参数和值分开,并将其加载到多维数组中以供以后使用。我知道我可以通过在“=”处分离字符串并剥离“/”来找到一种方法来做到这一点,但由于我对此有点新,我想看看是否有一种“优先”的处理方式有多个命名参数?

2 个答案:

答案 0 :(得分:6)

我对处理此问题的偏好是使用现有的库,例如Command Line Parser Library。 (但是,默认情况下,它使用different input format,基于--input=Value而不是/input=value。)

这使您无需自己编写代码,获得大量灵活性和健壮性,并简化代码。

答案 1 :(得分: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