6

通过命令行打开程序时,我需要向程序添加接受多个命名参数的能力。IE

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

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

最终,我想做的是将每个参数和值分开,并将其加载到多维数组中以备后用。我知道我可以通过分隔“=”处的字符串并剥离“/”来找到一种方法,但由于我对此有些陌生,我想看看是否有一种“首选”的处理方式有多个命名参数?

4

2 回答 2

7

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

这使您不必自己编写代码,获得很大的灵活性和健壮性,并简化您的代码。

于 2012-11-19T23:00:24.647 回答
3

这是一个小功能,可以做你想做的事。它允许您将所有参数存储在结构中的名称-值对中。

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
于 2015-01-29T21:11:03.790 回答