Streamwriter: Welches Encoding für Umlaute in Batch-Dateien?

16/06/2009 - 09:40 von Christian Stelte | Report spam
Hallo!

Ich muss eine Batchdatei wegschreiben die möglicherweise Umlaute in den
Parametern der DOS-Befehle besitzt:

Dazu folgendes Programmschnipsel, welches im Prinzip meinem Code entspricht:

string str = @"@echo off";
string str2 = @"copy c:\a.txt c:\ü.txt";

Streamwriter sw = new StreamWriter("c:\batch.cmd", false, _
System.Text.Encoding.xxxxxxxxx )
sw.WriteLine(str);
sw.WriteLine(str2);
sw.close

Danach einen "type c:\batch.cmd" liefert bei UTF7/8/32, Default, ASCII nur
Müll in den Umlauten. Bei Unicode sieht es gut aus, aber die Ausführung
scheitert am @ des "@echo off".

Ein im Web gefundenes
Encoding.GetEncoding(CultureInfo.InstalledUICulture.TextInfo.OEMCodePage)
funktioniert nicht und mit Codepage 850 und 1239 klappt es auch nicht.

Wie bekomme ich das hin?

Chris
 

Lesen sie die antworten

#1 Elmar Boye
16/06/2009 - 11:12 | Warnen spam
Hallo Christian,

"Christian Stelte" schrieb ...
Ich muss eine Batchdatei wegschreiben die möglicherweise Umlaute in den Parametern der DOS-Befehle besitzt:

Danach einen "type c:\batch.cmd" liefert bei UTF7/8/32, Default, ASCII nur
Müll in den Umlauten. Bei Unicode sieht es gut aus, aber die Ausführung scheitert am @ des "@echo off".

Ein im Web gefundenes
Encoding.GetEncoding(CultureInfo.InstalledUICulture.TextInfo.OEMCodePage) funktioniert nicht und mit Codepage 850 und 1239 klappt
es auch nicht.



OEMCodePage passt schon. CMD.EXE sollte Dir die gleiche Einstellung
bei Eingabe von "CHCP" zeigen.

Unten mal eine (schnell gestrickte) Funktion die TXT-Dateien kopiert,
wobei ich für den Test auch solche mit Umlauten etc. drin hatte.
Auch das initiale @echo off stellt kein Problem dar.

Gruß Elmar

private void WriteBatchCopy()
{
string directory = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
Encoding encoding = Encoding.GetEncoding(CultureInfo.InstalledUICulture.TextInfo.OEMCodePage);
Console.WriteLine("Encoding: {0}", encoding.CodePage);

using (StreamWriter writer = new StreamWriter(
Path.Combine(directory, "test.bat"),
false, encoding))
{
writer.WriteLine("@echo off");

// Liefert hier sinnige Dateinamen ala ÄÖÜàöüß.txt
string[] fileNames = Directory.GetFiles(directory, "*.txt");
foreach (string fileName in fileNames)
{
writer.WriteLine("copy \"{0}\" \"{1}\"",
Path.GetFileName(fileName),
Path.GetFileNameWithoutExtension(fileName) + ".bak");
}
writer.Flush();
}
}

Ähnliche fragen