Befehlszeilenargumente auslesen und verarbeiten

  • VB.NET

Es gibt 20 Antworten in diesem Thema. Der letzte Beitrag () ist von NoIde.

    Da via PN noch eine Frage von @Marcello dazu kam, ich den Weg welchen er wählte weniger schön fand habe ich nun mal ein besseres Beispiel gemacht. Wobei die Felder in der Klasse Args so heissen müssen wie das Argument, -serverip -> ServerIp, wobei Gross/Kleinschrift egal ist, da die Argumentnamen klein geschrieben sind und auch ToLower beim Feldnamen angewendet wird.

    VB.NET-Quellcode

    1. Imports System.Text.RegularExpressions
    2. Imports System.Reflection
    3. Public Class Form1
    4. Public Class Args
    5. Public ServerIp As String
    6. Public ServerSteamPort As String
    7. Public ServerGamePort As String
    8. Public ServerQueryPort As String
    9. Public ServerName As String
    10. Public ServerPlayers As String
    11. Public Difficulty As String
    12. Public InitType As String
    13. Public Slot As String
    14. Public Overrides Function ToString() As String
    15. Dim fields() As FieldInfo = Me.GetType().GetFields()
    16. Dim result As String = "{"
    17. For i = 0 To fields.Length - 1
    18. result &= String.Format("{0}: ""{1}""", fields(i).Name, fields(i).GetValue(Me))
    19. If Not i = fields.Length - 1 Then
    20. result &= ", "
    21. End If
    22. Next
    23. result &= "}"
    24. Return result
    25. End Function
    26. End Class
    27. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Shown
    28. Dim a As Args = ParseARGS("-serverip xxx.xxx.xxx.xxx -serversteamport 8766 -servergameport 27015 -serverqueryport 27016 -servername MyGame -serverplayers 8 -difficulty Normal -inittype Continue -slot 1")
    29. MessageBox.Show(a.ServerIp)
    30. MessageBox.Show(a.ToString)
    31. End Sub
    32. Public Function ParseARGS(ByVal arg As String) As Args
    33. Dim fields() As FieldInfo = GetType(Args).GetFields()
    34. Dim patternRaw As String = "(?<%FIELDNAME%>(?<=-%FIELDLOWERNAME%\s)(.*?)(?=(\s-)|($)))"
    35. Dim patterns() As String = New String(fields.Length - 1) {}
    36. For i = 0 To fields.Length - 1
    37. patterns(i) = patternRaw.Replace("%FIELDLOWERNAME%", fields(i).Name.ToLower)
    38. patterns(i) = patterns(i).Replace("%FIELDNAME%", fields(i).Name)
    39. Next
    40. Dim pattern As String = String.Join("|", patterns)
    41. Dim r As New Regex(pattern)
    42. Dim mc As MatchCollection = r.Matches(arg)
    43. Dim result As New Args
    44. For Each m As Match In mc
    45. For Each field As FieldInfo In fields
    46. If Not String.IsNullOrEmpty(m.Groups(field.Name).Value) Then
    47. field.SetValue(result, m.Groups(field.Name).Value)
    48. End If
    49. Next
    50. Next
    51. Return result
    52. End Function
    53. End Class


    Das was mich hier dran noch stört, ist das alles in Klasse Args als String deklariert ist, könnte man nun noch die Typen anpassen.
    Cloud Computer? Nein Danke! Das ist nur ein weiterer Schritt zur totalen Überwachung.
    „Wer die Freiheit aufgibt, um Sicherheit zu gewinnen, wird am Ende beides verlieren.“
    Benjamin Franklin

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „NoIde“ ()