2012-11-19 35 views
5

Tôi cần thêm khả năng chương trình chấp nhận nhiều thông số được đặt tên khi mở chương trình thông qua dòng lệnh. tức làPhân tích cú pháp nhiều tham số dòng lệnh được đặt tên

program.exe /param1=value /param2=value 

và sau đó có thể sử dụng các thông số này làm biến trong chương trình. Tôi đã tìm thấy một vài cách để hoàn thành phần này, nhưng dường như không thể tìm ra cách để kết hợp tất cả với nhau.

Tôi đã có thể chuyển một tham số có tên và khôi phục bằng cách sử dụng mã bên dưới và trong khi tôi có thể sao chép nó cho mỗi tham số có tên, tôi biết rằng không thể là cách được thực hiện.

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 

Ngoài ra, tôi có thể nhận được nhiều tham số giấu tên từ dòng lệnh sử dụng

My.Application.CommandLineArgs 

Nhưng điều này đòi hỏi các thông số tất cả được thông qua theo thứ tự/định dạng mỗi lần. Tôi cần phải có thể chuyển một tập hợp con các tham số ngẫu nhiên mỗi lần.

Cuối cùng, những gì tôi muốn có thể làm, là tách biệt mỗi đối số và giá trị, và tải nó vào một mảng đa chiều để sử dụng sau này. Tôi biết rằng tôi có thể tìm cách để làm điều này bằng cách tách chuỗi tại "=" và tước "/", nhưng khi tôi hơi mới, tôi muốn xem liệu có cách "tiền xử lý" để xử lý với nhiều tham số được đặt tên?

Trả lời

6

Sở thích của tôi để xử lý việc này là sử dụng thư viện hiện có, chẳng hạn như Command Line Parser Library. (Tuy nhiên, theo mặc định, nó sử dụng một different input format, dựa trên --input=Value thay vì /input=value.)

này mang lại cho bạn những lợi thế của việc không phải viết mã chính mình, nhận được rất nhiều sự linh hoạt và mạnh mẽ, và đơn giản hóa mã của bạn.

+0

đó chính xác là những gì tôi đang tìm kiếm. Và tôi thực sự không quan tâm định dạng đầu vào nào được sử dụng ... Tôi chưa phân phối bất cứ điều gì. Cảm ơn vì sự giúp đỡ nhanh chóng. – scholzr

1

Đây là một chức năng nhỏ để thực hiện những gì bạn muốn làm. Nó cho phép bạn lưu trữ tất cả các tham số trong các cặp tên-giá trị trong một cấu trúc.

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 
Các vấn đề liên quan