2012-11-19 15 views
5

È necessario aggiungere la possibilità a un programma di accettare più parametri con nome quando si apre il programma tramite la riga di comando. Ad esempioParametri di riga di comando multipli denominati multipli

program.exe /param1=value /param2=value 

e quindi essere in grado di utilizzare questi parametri come variabili nel programma. Ho trovato un paio di modi per realizzare pezzi di questo, ma non riesco a capire come mettere tutto insieme.

Sono stato in grado di passare un parametro denominato e recuperarlo utilizzando il codice riportato di seguito, e mentre potevo duplicarlo per ogni parametro denominato possibile, so che non può essere il modo prefferato per farlo.

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 

alternativa, posso ottenere più parametri senza nome dalla riga di comando utilizzando

My.Application.CommandLineArgs 

ma questo richiede che i parametri tutti essere passati nello stesso ordine/formato ogni volta. Devo essere in grado di passare ogni volta un sottoinsieme casuale di parametri.

In definitiva, ciò che vorrei essere in grado di fare, è separare ogni argomento e valore e caricarlo in un array multidimentale per un uso successivo. So che potrei trovare un modo per farlo separando la stringa al "=" e rimuovendo il "/", ma dato che sono un po 'nuovo per questo, volevo vedere se esisteva un modo "preffered" per trattare con più parametri con nome?

risposta

6

La mia preferenza per la gestione sarebbe utilizzare una libreria esistente, ad esempio Command Line Parser Library. (Tuttavia, per impostazione predefinita, utilizza un different input format, basato su --input=Value invece di /input=value.)

Questo ti dà il vantaggio di non dover scrivere il codice da soli, ottenendo un sacco di flessibilità e robustezza, e semplificando il codice.

+0

questo è esattamente quello che stavo cercando. E davvero non mi interessa quale formato di input è usato ... Non ho ancora distribuito nulla. Grazie per il rapido aiuto. – scholzr

1

Ecco una piccola funzione per eseguire ciò che si voleva fare. Permette di memorizzare tutti i parametri nelle coppie nome-valore in una struttura.

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