Wie kann ich unicode-Zeichen aus den robocopy-Prozess standard-Ausgabe in c#
Unserer Anwendung führt verschiedene Aktionen aus und zeigt die Ausgabe in einem log-Fenster angezeigt. Eine Aktion verwendet robocopy zum kopieren von Dateien zwischen Ordnern.
Dies funktioniert ok, bis Sie den robocopy-Ausgabe von unicode-Zeichen enthält. Ich verstehe, dass ich brauchen, um die Nutzung /unicode-option, aber alle ich scheine zu kommen zurück ist Kauderwelsch.
Hier mein vereinfachter code-Beispiel:
class Program
{
static void Main(string[] args)
{
StreamReader outputReader = null;
StreamReader errorReader = null;
using (Process process = new Process())
{
Encoding encoding = Encoding.Default;
if (encoding != null)
{
process.StartInfo.StandardOutputEncoding = encoding;
process.StartInfo.StandardErrorEncoding = encoding;
}
process.StartInfo.FileName = @"C:\Windows\system32\robocopy.exe";
process.StartInfo.Arguments = @"""D:\temp\некоторые случайные папки"" ""D:\temp\другой случайные папки"" /unicode";
process.StartInfo.ErrorDialog = false;
process.StartInfo.LoadUserProfile = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WorkingDirectory = @"D:\temp\некоторые случайные папки";
bool processStarted = process.Start();
if (processStarted)
{
//Get the output stream
outputReader = process.StandardOutput;
errorReader = process.StandardError;
process.WaitForExit();
string standardOutput = outputReader.ReadToEnd();
string errorOutput = errorReader.ReadToEnd();
if (!string.IsNullOrEmpty(standardOutput))
{
byte[] bytes = encoding.GetBytes(standardOutput);
byte[] convertedBytes = Encoding.Convert(encoding, Encoding.UTF8, bytes);
string convertedStandardOutput = Encoding.UTF8.GetString(convertedBytes);
Console.Write("Standard output: ");
Console.WriteLine(convertedStandardOutput);
}
if (!string.IsNullOrEmpty(errorOutput))
{
Console.Write("Error output: ");
Console.WriteLine(errorOutput);
}
}
}
Console.ReadKey();
}
}
Habe ich versucht, die verschiedenen encoding-Typen und Konvertierungen ohne Erfolg. Hier ist die Art der Ausgabe, die ich bekommen hab:
standardOutput: "ⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭ †佒佂佃奐††㨠›††潒畢瑳䘠汩潃祰映牯圠湩潤獷†††††††††††††††ⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭਊ†瑓牡整›潍摮祡㘱䴠牡档㈠‵㐱ㄺ㨵㈵ †潓牵散㨠䐠尺整灭㽜㼿㼿㼿㼿㼠㼿㼿㼿㼿㼠㼿㼿ੜ††䐠獥⁴›㩄瑜浥屰㼿㼿㼿㼠㼿㼿㼿㼿㼠㼿㼿ੜ †䘠汩獥㨠⨠⨮ऊ†† 传瑰潩獮㨠⨠⸀⨀ ⼀唀一䤀䌀伀䐀䔀 ⼀䐀䌀伀倀夀㨀䐀䄀 ⼀䌀伀倀夀㨀䐀䄀吀 ⼀刀㨀 ⼀圀㨀㌀ ⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭਭऊ†††††††††〠䐉尺整灭㽜㼿㼿㼿㼿㼠㼿㼿㼿㼿㼠㼿㼿ੜⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭਭ †††††††潔慴†䌠灯敩†歓灩数䴠獩慭捴†䘠䥁䕌⁄†䔠瑸慲ੳ††楄獲㨠††††ㄠ††††〠††††〠††††〠††††〠††††〠 †楆敬›††††‰††††‰††††‰††††‰††††‰††††ਰ†䈠瑹獥㨠††††〠††††〠††††〠††††〠††††〠††††〠 †楔敭›†㨰〰〺‰†㨰〰〺‰†††††††††††㨰〰〺‰†㨰〰〺ਰ†䔠摮摥㨠䴠湯慤ⱹㄠ‶慍捲〲㔱ㄠ㨴㔱㔺ਲ"
convertedStandardOutput: "?????????????????????????????????????????†????††?›††??????????????†††††††††††††††?????????????????????????????????????????†????›??????????`?????†??????????????????????††??4›?????????????????†???????††????????? ???????? ????????? ????????? ???? ???? ??????????????????????????????????????????†††††††††????????????????????????????????????????????????????????????†††††††???†????†?????????†???/†????††???††††?††††?††††?††††?††††?††††??†???›††††‰††††‰††††‰††††‰††††‰††††?†????††††?††††?††††?††††?††††?††††??†???›†???‰†???‰†††††††††††???‰†????†????????????????????"
Der Ausgang angezeigt, bei der Ausführung in einem Eingabeaufforderungsfenster:
------------------------------------------------------------------------------- ROBOCOPY :: Robustes Dateikopieren für Windows ------------------------------------------------------------------------------- Gestartet : Montag, 16. März 2015 14:24:01 Quelle : D:\temp\некоторые случайные папки\ Dest : D:\temp\другой случайные папки\ Dateien : *.* Optionen : * . * /U N I C O D E /D C O P Y : D A /C O P Y : D T /R : 1 0 0 0 0 0 0 /W : 3 0 ------------------------------------------------------------------------------ 0 D:\temp\некоторые случайные папки\ ------------------------------------------------------------------------------ Insgesamt Kopiert Skipped Mismatch FAILED Extras Dirs : 1 0 0 0 0 0 Dateien : 0 0 0 0 0 0 Bytes : 0 0 0 0 0 0 Mal : 0:00:00 0:00:00 0:00:00 0:00:00 Ende : Montag, 16. März 2015 14:24:01
Irgendwelche Ideen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie der /die UNICODE-option verbuggt ist: die einzige Sache, die es betrifft in die Ausgabe der Konsole ist die
Options :
Linie. (Man kann sagen, dass dieser Teil von Unicode-Leerzeichen zwischen den Zeichen, die verursacht werden durch zusätzliche null-bytes.) ROBOCOPY scheint immer noch zu schreiben, alles andere mit der Codepage des Systems. Aber der /die UNICODE-option hat Ursache ROBOCOPY zu schreiben, die Unicode-byte-order mark) am Anfang der Ausgabe, so StreamReader-Schalter auf Unicode, egal was StandardOutputEncoding, die Sie setzen. Das Ergebnis: Kauderwelsch.Statt /UNICODE verwenden Sie die /UNILOG-option, die angezeigt wird, korrekt zu funktionieren (zumindest unter Windows 8.1):
Lassen Sie mich Vorwort dieses post.. ich bin kein c# Entwickler, aber ich verstehe Datei-Codierung.
Ihre Datei eine Kodierung, und die Konsole hat eine Codierung für stdin und stdout. C# hat eine Kodierung für die Zeichenfolgen in seiner Laufzeit.. Eine Codierung ist die Zuordnung von Symbolen zu bits. Unicode ist ein Versuch zur Vereinheitlichung der vielen verschiedenen Arten von Codierung, blah, blah,
Ignorieren robocop für eine Sekunde, und finden Sie einfach heraus bekommen, die Konsole ordnungsgemäß drucken.
Erhalten die Codierung der Datei.
Holen Sie sich die Kodierung der Konsole.
Erhalten die Kennung, welche Karten der Kodierung
Erhalten die Codierung hinter dieser Kennung.
Alles, was jetzt bleibt, ist die Konvertierung von der Datei die Kodierung, die Kodierung zu erwarten, die von Ihrer Konsole, bevor Sie nach stdout schreiben.
Tipps: Ihre Konsole ist die Anzeige von Unicode-Zeichen in Ordnung. Meine Vermutung ist, dass die Datei UTF-16 und der Konsole erwartet UTF-8.
Könnten Sie einfach erstellen Sie eine leere Datei ist ANSI statt UTF-16 little-endian-byte-Reihenfolge, dass die robocopy erstellt im header...
Verwenden Sie Notepad++, um herauszufinden, die Datei encoding.
Fand ich einen workaround in dieser Super-User-Antwort von Karan:
Offensichtlich, könnten Sie schreiben Ihre eigenen code zu schreiben, der die Datei als UTF-8 anstatt mit MS word.