我需要添加程序的功能,以便在通过命令行打开程序时接受多个命名参数。即
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
但是这要求每次都以相同的顺序/格式传递参数。我需要每次能够传递一个随机的参数子集。
最终,我希望能够做的是将每个参数和值分开,并将其加载到多维数组中以供以后使用。我知道我可以通过在“=”处分离字符串并剥离“/”来找到一种方法来做到这一点,但由于我对此有点新,我想看看是否有一种“优先”的处理方式有多个命名参数?
答案 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