gpt4 book ai didi

c# - 如何从 c# 中的 robocopy 过程标准输出中获取 unicode 字符

转载 作者:行者123 更新时间:2023-11-30 16:55:44 26 4
gpt4 key购买 nike

我们的应用程序运行各种操作并在日志窗口中显示输出。一项操作使用 robocopy 在文件夹之间复制文件。

在 robocopy 输出包含 unicode 字符之前,这可以正常工作。我知道我需要使用/unicode 选项,但我似乎得到的只是乱码。

这是我的简化代码示例:

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();
}
}

我试过各种编码类型和转换都无济于事。这是我得到的输出类型:

standardOutput: "ⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭ †佒佂佃奐††㨠›††潒畢瑳䘠汩⁥潃祰映牯圠湩潤獷†††††††††††††††ⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭਊ†瑓牡整⁤›潍摮祡‬㘱䴠牡档㈠㄰‵㐱ㄺ㨵㈵ †潓牵散㨠䐠尺整灭㽜㼿㼿㼿㼿㼠㼿㼿㼿㼿㼠㼿㼿ੜ††䐠獥⁴›㩄瑜浥屰㼿㼿㼿㼠㼿㼿㼿㼿㼠㼿㼿ੜ †䘠汩獥㨠⨠⨮ऊ†† 传瑰潩獮㨠⨠⸀⨀ ⼀唀一䤀䌀伀䐀䔀 ⼀䐀䌀伀倀夀㨀䐀䄀 ⼀䌀伀倀夀㨀䐀䄀吀 ⼀刀㨀㄀       ⼀圀㨀㌀  ਀ⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭਭऊ†††††††††〠䐉尺整灭㽜㼿㼿㼿㼿㼠㼿㼿㼿㼿㼠㼿㼿ੜⴊⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭⴭਭ †††††††潔慴†䌠灯敩⁤†歓灩数⁤䴠獩慭捴⁨†䘠䥁䕌⁄†䔠瑸慲ੳ††楄獲㨠††††ㄠ††††〠††††〠††††〠††††〠††††〠 †楆敬⁳›††††‰††††‰††††‰††††‰††††‰††††ਰ†䈠瑹獥㨠††††〠††††〠††††〠††††〠††††〠††††〠 †楔敭⁳›†㨰〰〺‰†㨰〰〺‰†††††††††††㨰〰〺‰†㨰〰〺ਰ†䔠摮摥㨠䴠湯慤ⱹㄠ‶慍捲⁨〲㔱ㄠ㨴㔱㔺ਲ"


convertedStandardOutput: "?????????????????????????????????????????†????††?›††??????????????†††††††††††††††?????????????????????????????????????????†????›??????????`?????†??????????????????????††??4›?????????????????†???????††????????? ???????? ????????? ????????? ???? ???? ??????????????????????????????????????????†††††††††????????????????????????????????????????????????????????????†††††††???†????†?????????†???/†????††???††††?††††?††††?††††?††††?††††??†???›††††‰††††‰††††‰††††‰††††‰††††?†????††††?††††?††††?††††?††††?††††??†???›†???‰†???‰†††††††††††???‰†????†????????????????????"

在命令窗口中运行时显示的输出是:

 ■-------------------------------------------------------------------------------   ROBOCOPY     ::     Robust File Copy for Windows-------------------------------------------------------------------------------  Started : Monday, 16 March 2015 14:24:01   Source : D:\temp\некоторые случайные папки\     Dest : D:\temp\другой случайные папки\    Files : *.*  Options : * . *   / U N I C O D E   / D C O P Y : D A   / C O P Y : D A T   / R : 1 0 0 0 0 0 0   / W : 3 0------------------------------------------------------------------------------                           0    D:\temp\некоторые случайные папки\------------------------------------------------------------------------------               Total    Copied   Skipped  Mismatch    FAILED    Extras    Dirs :         1         0         0         0         0         0   Files :         0         0         0         0         0         0   Bytes :         0         0         0         0         0         0   Times :   0:00:00   0:00:00                       0:00:00   0:00:00   Ended : Monday, 16 March 2015 14:24:01

有什么想法吗?

最佳答案

看起来/UNICODE 选项有问题:它在控制台输出中唯一影响的是 Options : 行。 (你可以从字符之间的空格看出这部分是 Unicode,这是由额外的空字节引起的。)ROBOCOPY 似乎仍然使用系统代码页编写其他所有内容。但是/UNICODE 选项确实导致 ROBOCOPY 在输出的开头写出 Unicode 字节顺序标记,因此无论您设置什么 StandardOutputEncoding,StreamReader 都会切换到 Unicode。结果:乱码。

使用/UNILOG 选项代替/UNICODE,它似乎可以正常工作(至少在 Windows 8.1 上):

using (Process process = new Process())
{
string logFileName = Path.GetTempFileName();
process.StartInfo.FileName = @"C:\Windows\system32\robocopy.exe";
process.StartInfo.Arguments = @"""D:\temp\некоторые случайные папки"" ""D:\temp\другой случайные папки"" /UNILOG:" + logFileName;
process.StartInfo.ErrorDialog = false;
process.StartInfo.LoadUserProfile = false;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.WorkingDirectory = @"D:\temp\некоторые случайные папки";
bool processStarted = process.Start();

if (processStarted)
{
process.WaitForExit();
string output = File.ReadAllText(logFileName);
File.Delete(logFileName);
// TODO: Do something with the output.
}
}

关于c# - 如何从 c# 中的 robocopy 过程标准输出中获取 unicode 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29069401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com