Startparameter werden zerstückelt

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Startparameter werden zerstückelt

    Hallo,
    ich habe ein kleines Problem mit Startparametern und würde mich über einen Denkanstoß freuen, wie ich das Problem beheben kann.

    Ich starte mein Programm mit Startparametern, die aus einem anderen Programm übergeben werden.
    Das sieht so aus:

    Quellcode

    1. F:\Mailer.exe "%1" "%2" "%3" "%4"


    Die Parameter sehen z.B. so aus:

    Quellcode

    1. %1 = 01345
    2. %2 = 1
    3. %3 = [DC]A$HQ#ÖWcIs[EM]mY[US][BEL]rt[ENQ][STX][DC][ESC][LF]"j5oNe[EOT]b[FF]B
    4. %4 = GW


    Mein Programm behandelt das nun wie folgt:

    VB.NET-Quellcode

    1. Dim parameter(3) As String
    2. Dim i As Integer = 0
    3. For Each s As String In My.Application.CommandLineArgs
    4. parameter(i) = s
    5. Try
    6. writeInputLog(parameter(i))
    7. Catch ex As Exception
    8. MsgBox(Err.Number, ex.Message, ex.StackTrace.ToString)
    9. End Try
    10. i += 1
    11. Next
    12. writeInputLog("Ende")


    Nun habe ich das Problem, dass in Parameter %3 auch Anführungszeichen vorkommen. Da denkt nun mein Programm / Visual Studio das der Parameter zu Ende ist und beginnt mit dem neuen.

    Dann bekommen ich natürlich einen Fehler:
    Ein Ausnahmefehler des Typs "System.IndexOutOfRangeException" ist in AlarmMailer.exe aufgetreten.

    Zusätzliche Informationen: Der Index war außerhalb des Arraybereichs.


    Mit den Daten kann ich eh nichts anfangen und würde sie später verwerfen, aber was nervt ist, dass das Programm auf Windows XP läuft, es dann ständig Fehlerberichte an Microsoft versenden möchte und sich irgendwann aufhängt.

    Hat jemand eine Idee, wie ich das Problem lösen könnte?

    Danke.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „112marv“ ()

    Escape die " innerhalb der Argumente, dann sollte es passen:

    Quellcode

    1. PROGRAM.EXE "01345" "1" "some \"doublequotes\" in arguments" "GW"
    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

    NoIde schrieb:

    PROGRAM.EXE "01345" "1" "some \"doublequotes\" in arguments" "GW"
    Ich kenne das nur so:

    Quellcode

    1. PROGRAM.EXE "01345" "1" "some ""doublequotes"" in arguments" "GW"

    Also innerhalb der Parameter die ​" durch ​""ersetzen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ich escape " innerhalb strings in batch immer mit einem Backslash. Geht aber beides.
    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 1 mal editiert, zuletzt von „NoIde“ ()

    @NoIde @112marv Das Zerlegen kann man auch vom System machen lassen:

    VB.NET-Quellcode

    1. Dim args() = Environment.GetCommandLineArgs()
    Das erste Element ist dann der Pfad des Programms selbst.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Das Zerlegen kann man auch vom System machen lassen:


    Es kann zu Problemen mit "'s kommen, wenn diese nicht escaped werden. Da er keinen einfluss auf das hat was rein kommt und nicht escape'te " ihm probleme bereiten weil nicht richtig gesplittet wird, wüsste ich auch nur ganze Zeile hohlen und selbst verarbeiten.
    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

    NoIde schrieb:

    wenn diese nicht escaped werden.
    Das bedeutet aber, dass das programm Fehler des Aufrufenden erkennen soll und dann den Aufrufenden bitten muss, des Aufruf mit richtigen Parametern zu wiederholen?
    Dass das Programm die Fehler des Aufrufenden stillschweigend versucht zu korrigieren geht mit Sicherheit vor die Hose.
    Mach einen kleinen Test mit beliebigen Argumenten:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. ListBox1.DataSource = Environment.GetCommandLineArgs()
    3. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also sein Programm muss es wohl nicht erkennen, es ist ja bekannt das nicht escaped wird.

    Aber du hast mich auf etwas gebracht wo ich vorher garnet dran gedacht hab. Immerhin wird sein Programm ja aus einem Programm heraus gestartet, das macht das Programm sicher nicht willkürlich einfach so. Du hast aber recht, den Fehler so ausbügeln kann man machen, finde ich nach überlegen auch nicht gut. Ursache beheben(lassen), nicht nur gegen die Symptome angehen, sonst verschleppt man die Probleme nur.

    Da das Programm ja nicht Escaped also Fehlerhaft ist, kann man ja auch nicht sicher sein, das auf einmal ein \" im String ist wobei das " nicht escaped werden soll(escapen macht das Programm evtl. generall nicht), würde das Argument dann ohne\ rein kommen, was dann auch nicht passt. Der Te hat ja keinen Einfluss drauf, kann also nicht sicher sein, das er das bekommt was er erhofft.(korrekte Daten)

    @112marv
    Warum hast du eigendlich keinen Einfluss darauf? Immerhin startet dieses Programm ja deins. Wie kommt das zu Stande? Einfach so machen Programme das ja nicht. Was ist das für ein Programm welches deines startet?
    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

    NoIde schrieb:


    @112marv
    Warum hast du eigendlich keinen Einfluss darauf? Immerhin startet dieses Programm ja deins. Wie kommt das zu Stande? Einfach so machen Programme das ja nicht. Was ist das für ein Programm welches deines startet?


    Das "andere" Programm überwacht Meldungen unter anderem am seriellen Port und macht dann diverse Sachen damit. Z.B. in einer Liste ausgeben und eben die am seriellen Eingang empfangenen Daten in genau den vier Parametern zur Verfügung stellen.
    Und die vier Parameter kann ich leider nur so weitergeben wie sie sind und nicht vorher bearbeiten.

    112marv schrieb:

    und nicht vorher bearbeiten.
    Dann musst Du im empfangenden Programm etwas mehr Intelligenz reinbauen und und solltest beim Aufruf auf Escape-Zeichen verzichten.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!