Handling commandline arguments in VB.NET (or really anything) can be tricky. I came across the following class the other day while looking for a drop-in solution to a RAD I was developing.
Here’s what my usage shows for my application, thanks to the .NET class.
portscan.exe
portscan 0.9.2 by Rich Kreider Usage: portscan -h <host> -s <startport> -e <endport> -f -d -t <timeoutms> Options: -h Host. IP address or hostname. -s Start port. Begin scan at the specified port. -e End port. End scan at the specified port (max 65535). -f Fast scan. Scan without a timeout. May be unreliable. -t Timeout. Timeout in ms to confirm port open (not used with -f) -p Single port. Scan single port. Ignores -e and -s. Examples: Normal Scan: portscan -h 192.168.1.50 Normal Scan Custom Port Range: portscan -h 192.168.1.50 -s 1 -e 1024 Fast Scan All Ports: portscan -h 192.168.1.50 -f Normal Scan Single Port: portscan -h 192.168.1.50 -p 80
InputArguments.vb
Public Class InputArguments #Region "fields & properties" Public Const DEFAULT_KEY_LEADING_PATTERN As String = "-" Protected _parsedArguments As New Dictionary(Of String, String)(StringComparer.OrdinalIgnoreCase) Protected ReadOnly _keyLeadingPattern As String Default Public Property Item(key As String) As String Get Return GetValue(key) End Get Set(ByVal value As String) If key IsNot Nothing Then _parsedArguments(key) = value End If End Set End Property Public ReadOnly Property KeyLeadingPattern() As String Get Return _keyLeadingPattern End Get End Property #End Region #Region "public methods" Public Sub New(args() As String, pkeyLeadingPattern As String) _keyLeadingPattern = If(Not String.IsNullOrEmpty(pkeyLeadingPattern), pkeyLeadingPattern, DEFAULT_KEY_LEADING_PATTERN) If args IsNot Nothing AndAlso args.Length > 0 Then Parse(args) End If End Sub Public Sub New(args() As String) Me.New(args, Nothing) End Sub Public Function Contains(key As String) As Boolean Dim adjustedKey As String = Nothing Return ContainsKey(key, adjustedKey) End Function Public Overridable Function GetPeeledKey(key As String) As String Return If(IsKey(key), key.Substring(_keyLeadingPattern.Length), key) End Function Public Overridable Function GetDecoratedKey(ByVal key As String) As String Return If(Not IsKey(key), (_keyLeadingPattern & key), key) End Function Public Overridable Function IsKey(str As String) As Boolean Return str.StartsWith(_keyLeadingPattern) End Function #End Region #Region "internal methods" Protected Overridable Sub Parse(args() As String) For index As Integer = 0 To args.Length - 1 If args(index) Is Nothing Then Continue For End If Dim key As String = Nothing Dim val As String = Nothing If IsKey(args(index)) Then key = args(index) If index + 1 < args.Length AndAlso Not IsKey(args(index + 1)) Then val = args(index + 1) index += 1 End If Else val = args(index) End If ' adjustment If key Is Nothing Then key = val val = Nothing End If _parsedArguments(key) = val Next End Sub Protected Overridable Function GetValue(key As String) As String Dim adjustedKey As String = Nothing If ContainsKey(key, adjustedKey) Then Return _parsedArguments(adjustedKey) End If Return Nothing End Function Protected Overridable Function ContainsKey(ByVal key As String, <Runtime.InteropServices.Out()> ByRef adjustedKey As String) As Boolean adjustedKey = key If _parsedArguments.ContainsKey(key) Then Return True End If If IsKey(key) Then Dim peeledKey As String = GetPeeledKey(key) If _parsedArguments.ContainsKey(peeledKey) Then adjustedKey = peeledKey Return True End If Return False End If Dim decoratedKey As String = GetDecoratedKey(key) If _parsedArguments.ContainsKey(decoratedKey) Then adjustedKey = decoratedKey Return True End If Return False End Function #End Region End Class
To make use of the class, I have the following code sample.
Module Module1 Public ReadOnly Property CommandLineArguments As String() Get Return Environment.GetCommandLineArgs End Get End Property Dim host as String Sub Main() { Dim arguments As New InputArguments(CommandLineArguments) If arguments.Contains("-h") Then host = arguments.Item("-h") End If } End Module
Supplying portscan.exe -h 127.0.0.1
results in the host
variable being assigned the commandline argument value of 127.0.0.1
.
Permalink