Kodierung bei .bat und .cmd Dateien

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Eierlein.

    Kodierung bei .bat und .cmd Dateien

    Guten Abend Community,
    da ich gerade dabei war mir ein Robocopy tool zu programmieren, damit ich es einfach einstellen kann, habe ich folgende Frage:
    Wie kann ich die Kodierung bei StreamWriter einstellen?

    Bis jetzt sieht mein Quellcode so aus:

    VB.NET-Quellcode

    1. Dim robocopy as string = "robocopy " & source & " " & dest
    2. Dim objWriter As New System.IO.StreamWriter(savefile, False)
    3. objWriter.WriteLine(robocopy)
    4. objWriter.Close()


    Jetzt habe ich aber einen Fehler mit der Kodierung:

    Quellcode

    1. C:\Users\Michdi\Desktop>´╗┐ROBOCOPY C:\Users\Michdi\Desktop\UNTURNED C:\Users\Michdi\Desktop\UNTURNEDCOPY

    Die Ordner sind jetzt nur Beispiele, ist jetzt aber auch egal.

    Was mich stört sind diese Zeichen: ╗┐ (box drawings double down and left (U+2557) und box drawings light down and left (U+2510))
    Irgendwie stellt sich immer die Kodierung automatisch auf UTF-8 ohne BOM, obwohl sie für Batch ja auf ANSI stehen muss. Wenn ich dies in Notpad++ ändere und speichere, und sie anschließend ausführe (also die .bat Datei),
    stellt sich die Kodierung automatisch auf UTF-8 ohne BOM zurück und ergibt wieder den gleichen Fehler.

    Wie kann ich jetzt die Batch Datei ohne nervige Kodierungsfehler speichern?
    Übriegens: Wenn ich eine Datei normal anlege und dann als .bat / .cmd speichere, ist die Kodierung auch automatisch auf UTF-8 ohne BOM...

    Was kann ich da tun? Ich habe schon einen Post über dieses Thema gefunden, aber er hat mir nicht die Frage beantwortet.

    Es liegt an der Kodierung, da ich robocopy über Windowstaste + r und cmd normal ausführen kann!

    Danke im Vorraus,

    Michdi


    Gesamter Quellcode:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Dim source As String = ""
    4. Dim dest As String = ""
    5. Dim robocopy As String = ""
    6. Dim uname As String = ""
    7. Dim savefile As String = ""
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. FolderBrowserDialog1.ShowDialog()
    10. source = FolderBrowserDialog1.SelectedPath.ToString
    11. TextBox1.Text = source
    12. End Sub
    13. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    14. FolderBrowserDialog2.ShowDialog()
    15. dest = FolderBrowserDialog2.SelectedPath.ToString
    16. TextBox2.Text = dest
    17. End Sub
    18. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    19. uname = Environment.UserName
    20. End Sub
    21. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    22. SaveFileDialog1.InitialDirectory = "C:\users\" & uname & "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
    23. SaveFileDialog1.ShowDialog()
    24. savefile = SaveFileDialog1.FileName.ToString
    25. If CheckBox1.Checked = True Then
    26. robocopy = "ROBOCOPY " & source & " " & dest & " /E"
    27. If CheckBox2.Checked = True Then
    28. robocopy = "ROBOCOPY " & source & " " & dest & " /E /MIR /dcopy:T"
    29. End If
    30. End If
    31. If CheckBox2.Checked = True Then
    32. robocopy = "ROBOCOPY " & source & " " & dest & " /E /MIR /dcopy:T"
    33. If CheckBox1.Checked = True Then
    34. robocopy = "ROBOCOPY " & source & " " & dest & " /E"
    35. End If
    36. End If
    37. Dim objWriter As New System.IO.StreamWriter(savefile, False, System.Text.Encoding.ASCII)
    38. objWriter.WriteLine(robocopy)
    39. objWriter.Close()
    40. End Sub
    41. End Class


    *Topic verschoben*
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    ´╗┐ sind unter der OEM (DOS) CP 850 die Zeichen 239, 187, 191

    Unter CP 1252 (Ansi) sind 239 -> ï, 187 -> », 191 -> ¿

     ist der UTF8-BOM (Hex EF BB BF)

    Falls Zeichen > 127 (Z. B. Umlaute) vorkommen benötigst du die CP 850 bzw. 437 ansonsten reicht ASCII

    Quellcode

    1. C:\Users\Michdi\Desktop>´╗┐ROBOCOPY C:\Users\Michdi\Desktop\UNTURNED C:\Users\Michdi\Desktop\UNTURNEDCOPY


    Hinter deinen Ascii-Text '"C:\Users\Michdi\Desktop>"

    hast du einen Text mit UTF8-Bom eingefügt.

    ´╗┐ ----> UTF8-BOM (Hex EF BB BF) wie er in der Konsole angezeigt wird.
    ROBOCOPY C:\Users\Michdi\Desktop\UNTURNED C:\Users\Michdi\Desktop\UNTURNEDCOPY

    Da der BOM mitten im Text steht, wird er nicht als BOM sondern als Text interpretiert.


    Erklär nochmal Schritt für Schritt, wie du das geschafft hast.
    Ich habe als erstes eine Form erstellt mit zwei FolderBrowserDialogen und einem Savefiledialog. Diese sieht so aus:


    Man kann halt die verschiedenen Pfade auswählen, also Quelle und der Ort wo es hinkopiert werden soll.Im Code sieht das ganze dann so aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. FolderBrowserDialog1.ShowDialog()
    3. source = FolderBrowserDialog1.SelectedPath.ToString
    4. TextBox1.Text = source
    5. End Sub


    Das ganze habe ich dann noch für destination gemacht mit einem zweiten Knopf.Wenn man auf Save Robocopy klickt passiert folgendes:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. SaveFileDialog1.InitialDirectory = "C:\users\" & uname & "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
    2. SaveFileDialog1.ShowDialog()
    3. savefile = SaveFileDialog1.FileName.ToString

    uname ist hier als Environment.UserName definiert.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim objWriter As New System.IO.StreamWriter(savefile, False, System.Text.Encoding.ASCII)
    2. objWriter.WriteLine(robocopy)
    3. objWriter.Close()


    Hier wird alles gespeichert. Als Pfad hatte ich wie gesagt C:\Users\Michdi\Desktop\UNTURNED zu C:\Users\Michel\Desktop\UNTURNEDCOPY.
    Das ist alles was hier passiert.Wenn ich die fertige Datei jetzt ausführe sieht das ganze so aus:


    Der Code sieht übriegens so aus:

    Quellcode

    1. robocopy C:\Users\Michel\Desktop\UNTURNED C:\Users\Michel\Desktop\UNTURNEDCOPY
    2. pause


    Ich habe jetzt mal ein bisschen rumprobiert, es geht trotzdem nicht... Kann mir da wer helfen?


    Das komische ist, wenn ich das ganze über cmd.exe per Hand eingebe funktioniert es:


    Michdi
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



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

    Das klappt leider auch nicht :(

    UPDATE
    Es klappt, wenn ich eine Textdatei erstelle, dort mit Notepad++ den Inhalt reinschreibe, diese speichere, und dann unter Eigenschaften auf .bat abändere. Für jedes bearbeiten muss ich die Datei wieder in .txt umbennen.
    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



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

    VB.NET-Quellcode

    1. Dim objWriter As New System.IO.StreamWriter(savefile, False, System.Text.Encoding.ASCII)
    2. objWriter.WriteLine(robocopy)
    3. objWriter.Close()


    robocopy ist eben der Befehl, also robocopy source destination /E


    Für jedes bearbeiten muss ich die Datei wieder in .txt umbennen.

    Warum?


    Da habe ich keine Ahnung, aber es klappt.

    //Edit:
    Weil die Leute den Sourcecode nochmal haben wollten:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Public Class Form1
    3. Dim source As String = ""
    4. Dim dest As String = ""
    5. Dim robocopy As String = ""
    6. Dim uname As String = ""
    7. Dim savefile As String = ""
    8. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    9. FolderBrowserDialog1.ShowDialog()
    10. source = FolderBrowserDialog1.SelectedPath.ToString
    11. TextBox1.Text = source
    12. End Sub
    13. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    14. FolderBrowserDialog2.ShowDialog()
    15. dest = FolderBrowserDialog2.SelectedPath.ToString
    16. TextBox2.Text = dest
    17. End Sub
    18. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    19. uname = Environment.UserName
    20. End Sub
    21. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    22. SaveFileDialog1.InitialDirectory = "C:\users\" & uname & "\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup"
    23. SaveFileDialog1.ShowDialog()
    24. savefile = SaveFileDialog1.FileName.ToString
    25. If CheckBox1.Checked = True Then
    26. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E"
    27. If CheckBox2.Checked = True Then
    28. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E /MIR /dcopy:T"
    29. End If
    30. End If
    31. If CheckBox2.Checked = True Then
    32. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E /MIR /dcopy:T"
    33. If CheckBox1.Checked = True Then
    34. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E"
    35. End If
    36. End If
    37. Dim objWriter As New System.IO.StreamWriter(savefile, False, System.Text.Encoding.ASCII)
    38. objWriter.WriteLine(robocopy)
    39. objWriter.Close()
    40. End Sub
    41. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    42. If CheckBox1.Checked = True Then
    43. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E"
    44. If CheckBox2.Checked = True Then
    45. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E /MIR /dcopy:T"
    46. End If
    47. End If
    48. If CheckBox2.Checked = True Then
    49. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E /MIR /dcopy:T"
    50. If CheckBox1.Checked = True Then
    51. robocopy = "ROBOCOPY """ & source & """ """ & dest & """ /E"
    52. End If
    53. End If
    54. Process.Start("cmd", "/c " + robocopy)
    55. End Sub
    56. End Class

    Die beste maschinelle Übersetzung der Welt - DeepL Übersetzer
    Alle Zitate, die ich seit dem 1.9.2017 übersetzt habe, wurden vollautomatisch mit DeepL übersetzt.



    Die erstellung der .bat Datei kannst du mit folgendem Consolenprogramm testen:

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main()
    3. Dim source As String = "C:\Users\Michdi\Desktop\UNTURNED"
    4. Dim dest As String = "C:\Users\Michdi\Desktop\UNTURNEDCOPY"
    5. Dim savefile As String = "d:\##\RoboTest.bat" '<---- anpassen
    6. Dim robocopy As String = "robocopy " & source & " " & dest
    7. Dim objWriter As New StreamWriter(savefile, False, Encoding.ASCII)
    8. objWriter.WriteLine(robocopy)
    9. objWriter.WriteLine("Pause")
    10. objWriter.Close()
    11. End Sub
    12. End Module



    Die Zeichen ´╗┐ (239, 187, 191 in der Console, OEM CP850) können nicht bei encoding.ASCII von deinem Programm kommen.

    Encoding.ASCII nur Zeichen bis 127, Zeichen ab 128 werden als Fragezeichen »?« dargestellt
    <p>

    ErfinderDesRades schrieb:

    ich f&uuml;r mein Teil steuere Robocopy mit&nbsp;<br />
    VB.NET-Quellcode<br />
    Encoding.GetEncoding(437) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;'OEM (DOS) 437<br />
    erfolgreich an
    </p><p>Ist die Kodierung von Batchdateien nicht OEM (DOS) 5850????</p><br><br>&nbsp;