Sonderzeichen schummelt sich in String

  • VB.NET
  • .NET (FX) 4.0

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

    Sonderzeichen schummelt sich in String

    Hallo Leute,

    schreibe gerade an einer Anwendung, die eine Batch File erstellt und diese File per Routine als Administrator ausführt. Soweit klappt alles,
    außer dass der Befehl, genauer gesagt der String, welchen ich in die Datei schreibe Problemchen macht... <X

    So sieht der Code aus(Auszug):

    VB.NET-Quellcode

    1. File.Create("C:\temp\delreg.bat").Dispose()
    2. Dim befehl As String
    3. befehl = "reg delete " & (Chr(34)) & "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" & (Chr(34)) & " /v AutoAdminLogon /f"
    4. My.Computer.FileSystem.WriteAllText("C:\temp\delreg.bat", befehl, False)
    5. adminstart("C:\temp\delreg.bat", "Administrator") 'Administrator Routine


    In der Batch File steht nach Ausführung des Codes:
    reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon

    Aber bei Ausführung passiert nichts. Danach habe ich mir das ganze genauer angesehen und versucht die Batch Datei in der Console auszuführen.
    Es wurde mir folgender Fehler zurückgegeben:

    ´╗┐reg delete "HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon" /v AutoAdminLogon /f
    Der Befehl "´╗┐reg" ist entweder falsch geschrieben oder
    konnte nicht gefunden werden.


    Wenn ich bei Ausführung den String im Debugger überprüfe, steht der String richtig in der Variable ?( . Wenn ich auf Verdacht, vor schreiben in
    der Datei eine IF-Abfrage auf befehl.Contains("´╗┐") mache wird diese nicht schlagend. Das Zeichen ist also schlichtweg weder optisch noch versteckt im
    String vorhanden. Dennoch taucht es in der Datei auf.

    Jemand ne Idee?
    Bin für jede Hilfe dankbar!

    Grüße,

    v-go schrieb:

    ╗┐
    sind Unicode-Kennung für Big- oder Low-Endian im Dateiformat.
    Wenn Du die Batch schfreibst, mach das mit dem Encoding UTF8 oder ANSI.
    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!
    Du musst die Datei nicht zuerst erstellen, um sie danach komplett zu überschreiben. Verwende System.IO.File.WriteAllText(Pfad, Inhalt, System.Text.Encoding.Utf8)
    Um in einem String ein Anführungszeichen anzugeben, kannst Du das Anführungszeichen doppelt hinschreiben:

    VB.NET-Quellcode

    1. "reg delete ""HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"" /v AutoAdminLogon /f"


    Probier mal, den Anfang des Strings zu markieren (also "reg) und neu zu schreiben. Mir ist aufgefallen, dass man im VisualStudio nicht druckbare Sonderzeichen in Strings einfügen kann. Vielleicht hat sich da was eingeschlichen.

    Es könnte aber auch ein Nebeneffekt von File.Create("C:\temp\delreg.bat").Dispose() sein.

    Edit: Wenn es tatsächlich an der BOM liegt, empfehle ich besonders, System.IO.File.WriteAllText(Pfad, Inhalt, System.Text.Encoding.Utf8) zu verwenden.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Danke für eure Antworten!!!

    leider gleicher Fehler, mit System.IO.File.WriteAllText(Pfad, Inhalt, System.Text.Encoding.Utf8) und ohne File.Create("").Dispose :cursing:
    Befehle habe ich auch neu geschrieben, zur Sicherheit...


    Bilder
    • error_sonderzeichen.JPG

      59,51 kB, 985×322, 1.647 mal angesehen
    ja, und hast du mal das andere vorgeschlagene Encoding probiert?

    Und meine Versuche mit Consol brachten mich aufs Dos-Encoding

    VB.NET-Quellcode

    1. Encoding.GetEncoding(437)
    wäre also auch mal n Versuch wert.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Ja habe ich, ANSI klappt aber nicht:
    Fehler 7 "ANSI" ist kein Member von "System.Text.Encoding".

    Was aber klappt ist: System.Text.Encoding.ASCII und damit funktioniert der Befehl 8-)
    Durch eure Tipps bin ich auf die Lösung gekommen, danke euch vielmals!

    v-go schrieb:

    "ANSI"
    Ist die Schreibweise korrekt gewesen?
    Lass Dir von der Entwicklungsumgebung helfen.
    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!
    Die Entwicklungsumgebung schlägt mir ANSI auch gleich gar nicht vor X/



    Nachtrag: "ANSI" steht ebenfalls nicht zu Auswahl, wenn ich den Reiter "Alle" auswähle...

    Zitat entfernt. ~Thunderbolt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Thunderbolt“ ()

    Interessant. Ich kann den Fehler reproduzieren.
    Bei UTF8 müsste mans so machen:

    VB.NET-Quellcode

    1. System.IO.File.WriteAllText(Pfad, Inhalt, New System.Text.UTF8Encoding(False)) 'False bedeutet, dass die BOM nicht eingefügt wird


    ANSI ist übrigens System.Text.Encoding.Default, und damit funktioniert es ebenfalls wie erwartet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    ErfinderDesRades schrieb:

    aha. Also doch BOMs. post#2 habich gleich beargwöhnt.
    Interesse an BOM-Background? codeproject.com/KB/files/BomDetecting.aspx


    Sehr interessantes Thema, lese ich mir gleich mal durch! Danke dafür!
    ja, so sukzessive bin ich hinter die Bedeutung einiger Encodings gekommen, und Varianten, sie zu addressieren:

    Quellcode

    1. Encoding.Default 'Ansi (CP1252 bei deutschem Windows)
    2. Encoding.GetEncoding(1252) 'Ansi
    3. Encoding.UTF8 'UTF8
    4. Encoding.GetEncoding(65001) 'UTF8
    5. Encoding.Unicode 'UTF16LE
    6. Encoding.GetEncoding(437) 'OEM (DOS) 437
    7. Encoding.ASCII 'Nur 7-Bit Zeichen (bis Zeichen 127)
    Und wie in post#5 erwähnt: Bei olle DOS würde ich auf OEM tippen.