C# 在'System.Diagnostics.Process.ErrorDataReceived'中保留特殊字符`

C# 在'System.Diagnostics.Process.ErrorDataReceived'中保留特殊字符`,c#,C#,我试图使用System.Diagnostics.Process来派生Git实例,并将其输出重定向到我自己的程序中。我正在使用以下最小代码: 使用(var进程=新进程) { StartInfo={ FileName=@“C:\ProgramFiles\Git\bin\Git.exe”, UseShellExecute=false, RedirectStandardError=true, 参数=$“克隆--进度--裸{RepositoryUrl}{destinationDirectory}” } }

我试图使用
System.Diagnostics.Process
来派生Git实例,并将其输出重定向到我自己的程序中。我正在使用以下最小代码:

使用(var进程=新进程)
{
StartInfo={
FileName=@“C:\ProgramFiles\Git\bin\Git.exe”,
UseShellExecute=false,
RedirectStandardError=true,
参数=$“克隆--进度--裸{RepositoryUrl}{destinationDirectory}”
}
})
{
process.ErrorDataReceived+=(s,e)=>Console.WriteLine(e.Data);
process.Start();
process.BeginErrorReadLine();
process.WaitForExit();
}
运行此代码将生成以下输出:

克隆到裸存储库“”。。。
远程:枚举对象:5,完成。
远程:计数对象:20%(1/5)
远程:计数对象:40%(2/5)
远程:计数对象:100%(5/5)
远程:计数对象:100%(5/5),完成。
远程:压缩对象:33%(1/3)
远程:压缩对象:66%(2/3)
远程:压缩对象:100%(3/3)
远程:压缩对象:100%(3/3),完成。
接收对象:0%(1/4973)
接收对象:1%(50/4973)
接收对象:46%(2288/4973)
接收对象:47%(2338/4973)
接收对象:48%(2388/4973),6.95 MiB | 13.89 MiB/s
接收对象:49%(2437/4973),6.95 MiB | 13.89 MiB/s
接收对象:98%(4874/4973),18.66 MiB | 18.66 MiB/s
接收对象:99%(4924/4973),18.66 MiB | 18.66 MiB/s
远程:总计4973(增量0),重复使用5(增量0)
接收对象:100%(4973/4973),18.66 MiB | 18.66 MiB/s
接收对象:100%(4973/4973),21.21 MiB | 17.53 MiB/s,完成。
解析增量:0%(0/1261)
解析三角洲:1%(14/1261)
解析三角洲:100%(1261/1261)
解析增量:100%(1261/1261),完成。
在终端中,重复的行实际上会相互覆盖,以便显示单个递增计数器。这是通过输出回车来完成的,回车将终端的光标重置为第一列

另一方面,似乎
过程
基础设施在将Git的输出返回给我的代码之前,会剥离所有换行符(如预期的)以及回车符。我不能把它们放回我自己,因为并不是所有Git的输出都应该使用它们,而且我也不知道哪一个会在它们被剥离后使用它们


如何在
进程中禁用特殊字符剥离
'异步输出重定向,以按原样接收输出?

不幸的是,这似乎是在
异步流阅读器中硬编码的(参考源:)由
BeginErrorReadLine
/
ErrorDataReceived
逻辑内部使用。我不确定,但也许“手动”轮询错误通道TextReader可以帮助您获得完整的错误输出,包括任何控制字符..我不太清楚git的命令行参数,但如果有命令行选项可以调整输出,使其更适合重定向输出,我也不会感到惊讶…@elgonzo Argh。看来我要回到C风格的缓冲区旋转了。快乐我已经检查过了,Git没有为进度信息提供如此细粒度的控制。