Problem mit Leerzeichen in Dateinamen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Takafusa.

    Problem mit Leerzeichen in Dateinamen

    Schönen Abend,

    ich knoble an einem Problem mit Leerzeichen in Dateinamen. Zum Aufrufen benutze ich u.a. Sub.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim p As New Process()
    3. Try
    4. p.StartInfo = New ProcessStartInfo(FullPath) With {
    5. .CreateNoWindow = False
    6. }
    7. p.Start()
    8. Catch ex As Exception
    9. MsgBox(ex.Message & vbCrLf & FullPath)
    10. End Try
    11. End Sub


    Den String "FullPath" habe ich "zusammengebastelt" und alle Pfade mittels ch(34) in Anführungszeichen gesetzt. Er lautet nun:

    "C:\Program Files\MTI-Update\avrdude" -C"C:\Program Files\MTI-Update\avrdude.conf" -v -patmega328p -carduino -PCOM4 -b57600 -D -Uflash:w:"C:\Program Files\MTI-Update\MTI00X-V4.hex":i

    Aber selbst ohne Übergabeparmeter nur mit "C:\Program Files\MTI-Update\avrdude" will es nicht klappen.
    Wenn ich jedoch den String aus dem Textfenster, das ich zur Kontrolle habe, kopiere und in die Kommandozeile einfüge, klappt es.
    Der String ist also richtig zusammengebaut, aber trotzdem stört sich die Shell an den Leerzeichen. Fehlerrückmeldung der ex.message: "Datei nicht gefunden".
    Hat da jemand einen Vorschlag, woran das liegt und wie man es beheben kann?

    hier noch die Bastelstube für den String:

    VB.NET-Quellcode

    1. Sub BuildPath(Path As String, Filename As String)
    2. Dim Param1 As String = "\avrdude" & Chr(34) & " -C"
    3. Dim Param2 As String = "\avrdude.conf" & Chr(34) & " -v -patmega328p -carduino -P"
    4. Dim Param3 As String = " -b" '
    5. Dim Param4 As String = " -D -Uflash:w:"
    6. Dim Param5 As String = ":i"
    7. ' Pfade zusammenbauen
    8. FullPath1 = Chr(34) & Path & Param1
    9. Fullpath2 = Chr(34) & Path & Param2 & Port & Param3 & Baudrate & Param4 & Chr(34) & Filename & Chr(34) & Param5
    10. FullPath = FullPath1 & Fullpath2
    11. TextBox2.Clear()
    12. TextBox2.Text = FullPath
    13. End Sub
    Dann zeig uns mal wie das Ergebniss ausehen soll, dazu was du der Funktion übergibst.

    Edit @MarcelBB
    Ich glaube jetzt sehe ich dein Problem, du haust den ganzen Pfad + Argumente rein im Kontruktor von ProcessStartInfo, das könnte es sein.
    Probier mal so:

    VB.NET-Quellcode

    1. Dim avrDude As String = "C:\Program Files\MTI-Update\avrdude.exe"
    2. Dim avrDudeConfig As String = "C:\Program Files\MTI-Update\avrdude.conf"
    3. Dim hexFilename As String = "C:\Program Files\MTI-Update\MTI00X-V4.hex"
    4. Dim portName as string = "COM4"
    5. Dim baudRate As Integer = 57600
    6. Dim p As New Process
    7. p.StartInfo.FileName = avrDude
    8. p.StartInfo.Arguments = $"""-C {avrDudeConfig} -v -patmega328p -carduino -P{portName} -b{baudRate} -D -Uflash:w:{hexFilename}:i"""
    9. 'oder
    10. 'p.StartInfo.Arguments = $"""-C {avrDudeConfig}"" -v -patmega328p -carduino -P{portName} -b{baudRate} -D -Uflash:w:""{hexFilename}"":i"
    11. p.Start()

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Takafusa“ ()

    @Morrison: Ja hatte ich mal probiert, aber da gibt es wohl keine echten Konventionen, außer dass es egal ist ;) Im Ernst: Brachte nichts.
    @Takafusa: Selbes Spiel, es fehlen wohl die Anführungszeichen. Wenn ich es über mein Programm aufrufe, schließt sich die Shell sofort wieder und ich bekomme keine Fehlermeldung. Wenn ich es manuell in die Kommandozeile kopiere und ausführen will, kommt eine Fehlermeldung, die darauf hindeutet, dass er ab dem Leerzeichen den Pfad nicht mehr erkennt:

    C:\Users\maboo>C:\Program Files\MTI-Update\avrdude.exe"-C C:\Program Files\MTI-Update\avrdude.conf -v -patmega328p -carduino -PCOM4 -b57600 -D -Uflash:w:C:\Program Files\MTI-Update\MTI00X-V4.hex:i"
    Der Befehl "C:\Program" ist entweder falsch geschrieben oder konnte nicht gefunden werden.
    Achja, der pfad zum AVRDude hatte ich vergessen. Beachte die 3Fachen "
    Doppelte " werden im string zu 1 "

    VB.NET-Quellcode

    1. Dim avrDude As String = """C:\Program Files\MTI-Update\avrdude.exe"""
    2. Dim avrDudeConfig As String = "C:\Program Files\MTI-Update\avrdude.conf"
    3. Dim hexFilename As String = "C:\Program Files\MTI-Update\MTI00X-V4.hex"
    4. Dim portName as string = "COM4"
    5. Dim baudRate As Integer = 57600
    6. Dim p As New Process
    7. p.StartInfo.FileName = avrDude
    8. p.StartInfo.Arguments = $"""-C {avrDudeConfig} -v -patmega328p -carduino -P{portName} -b{baudRate} -D -Uflash:w:{hexFilename}:i"""
    9. 'oder
    10. 'p.StartInfo.Arguments = $"-C ""{avrDudeConfig}"" -v -patmega328p -carduino -P{portName} -b{baudRate} -D -Uflash:w:""{hexFilename}"":i"
    11. p.Start()


    Der pfad zum avrkumpel sollte dann passen.
    Ausgabe StartInfo.Arguments variante 1:
    "-C C:\Program Files\MTI-Update\avrdude.conf -v -patmega328p -carduino -PCOM4 -b57600 -D -Uflash:w:C:\Program Files\MTI-Update\MTI00X-V4.hex:i"
    Ausgabe StartInfo.Arguments variante 2:
    -C "C:\Program Files\MTI-Update\avrdude.conf" -v -patmega328p -carduino -PCOM4 -b57600 -D -Uflash:w:"C:\Program Files\MTI-Update\MTI00X-V4.hex":i
    Vollzug! :thumbsup:


    Allerdings ging bei mir nur die Variante 2 :

    p.StartInfo.Arguments = $"-C ""{avrDudeConfig}"" -v -patmega328p -carduino -P{portName} -b{baudRate} -D -Uflash:w:""{hexFilename}"":i"

    Was alles ein bisschen merkwürdig ist, denn beim Googeln in einschlägig berüchtigten Foren ( und auf der MS Seite) liest man immer wieder man solle chr(34) verwenden, wegen ANSI konform Blabla...
    Bei mir hat chr(34) jedenfalls NICHT funktioniert.
    Vielen Dank!

    Ich muss jetzt erst mal auseinanderfummeln, was genau du da gemacht hats. Evtl. kannst du ja kurz was zu sagen, falls jemand anders auch auf das Problem trifft. Mein Pfad ist ja sehr speziell..

    MarcelBB schrieb:

    Bei mir hat chr(34) jedenfalls NICHT funktioniert.
    Bevor Du einen String verwendest, sieh ihn Dir an.
    Das Studio merkt, wenn die """" gepaart sind oder nicht. Chr(34) wird da außen vor gelassen.
    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!

    MarcelBB schrieb:

    Ich muss jetzt erst mal auseinanderfummeln, was genau du da gemacht hats. Evtl. kannst du ja kurz was zu sagen,


    Viel zu sagen gibt es da nicht, ich habe nur mit String-Interpolation den String gebildet. Geht auch ohne, ist aber nicht so schön, ich finde das so lesbarer. Siehe hier, ist eine ganz einfach Sache, kannste in Sekunden erlernen. Jedenfalls alles was nicht in {} bleibt wie es ist, was in dem klammern ist(die variablen) werden in den String an dieser Stelle "eingepflanzt".
    docs.microsoft.com/en-us/dotne…ings/interpolated-strings

    Und wie RodFromGermany bereits sagte, ohne Chr(34) und mit ", hilft dir das Studio. Mit Chr(34) und du vergisst irgendwo einen sieht du keinen Fehler im Studio, da ziehe ich doch dopppelte " vor. Und richtig gemacht, geht es auch mit Chr(), fehlte wohl einer, oder war an falschen positionen, wie bei Variante 1 von mir, da passte die Zeile mit den Argumenten nicht 100%.

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