C# - 处理重定向输出 - 控制台与CMD窗口不同

3

我有一个应用程序,其中有一个使用cmd程序的Process。进程的输出被重定向如下:

pr.StartInfo.RedirectStandardOutput = true;
pr.StartInfo.UseShellExecute = false;
pr.StartInfo.CreateNoWindow = true;                                         
pr.EnableRaisingEvents = true
pr.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
pr.OutputDataReceived += new DataReceivedEventHandler(OnDataReceived);      
pr.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceived); 

接着,输出内容会使用以下代码写入控制台:

public void OnDataReceived(object sender, DataReceivedEventArgs e)
{
    if(e.Data != null)                                  
    {
        Console.WriteLine(e.Data);
    }
}

我的问题是Visual Studio打印输出的结果与命令行输出的结果非常不同。例如,我正在尝试从输出中提取数据,以查看已完成多少工作。我的应用程序输出如下:
0K .......... .......... .......... .......... .......... 1% (null)
50K .......... .......... .......... .......... .......... 2% (null)
100K .......... .......... .......... .......... .......... 3% (null)
150K .......... .......... .......... .......... .......... 5% (null)
原始命令行程序输出(随着时间的推移,进度条和百分比逐渐累积):
100%[===================================]
这可能看起来不是很大的差异,但对于我要实现的目标而言,它是很重要的。为什么Visual Studio的输出结果与CMD的输出结果不完全相同呢?
PS:两个示例的参数都是相同的。
2个回答

1
那是因为wget检测到您没有在可见控制台下运行。有一些参数可以更改这个设置。
具体原因是,wget构建[====的方式是通过覆盖当前行。通过重定向看到的输出可能会像这样:
  5% [=
 10% [==
 15% [===
 20% [====

等等。所有这些都在新的一行上。

您可以通过将--progress=bar添加到参数中来强制执行此类型的反馈。


这是wput,而不是wget。不确定这是否有多大区别。 - nf313743
同样适用于wput。您尝试过添加进度条参数吗? - Pieter van Ginkel
是的。不幸的是,wput没有提供这个参数。 - nf313743
哦,真遗憾。当应用程序试图变得聪明时,这是很烦人的 :)。 - Pieter van Ginkel

0
一个控制台和一个文件是非常不同的。进度条明显使用了一些特殊的控制台特定功能,在重定向时不存在(这实际上是一个文件)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接