我有运行控制台命令/实用程序的代码,使用'Debug.WriteLine'监视实时输出,并在需要时将最终输出写入日志文件。
编辑:它不适用于分析命令行实用程序Praatcon.exe。它可以下载from here。只需在没有参数的情况下调用praatcon.exe,它应该在'stdout'上写下Usage。代码不会抓住它。
问题是,它适用于某些实用程序,我可以看到调试输出以及登录文件。但对于某些实用程序,我看到空命令,即使我通过CMD窗口运行这些命令,我看到输出。我正在捕获输出和错误的流。
有人可以帮我这个吗?
可以找到完整代码here
以下是我尝试的方法
ProcessStartInfo的初始化
var info = new ProcessStartInfo(command, parameters)
{
WorkingDirectory = workingDirectory,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true
};
运行该过程并初始化输出和错误流的字符串构建器。
var process = Process.Start(info);
var output = new StringBuilder();
var error = new StringBuilder();
启动阅读流的任务
var errorTask = process.StandardError.ReadLineAsync();
var lineTask = process.StandardOutput.ReadLineAsync();
这是我的while循环,用于监视进度并在有可用时将输出写入Debug Output窗口。
while (process.HasExited == false)
{
if (lineTask.IsCompleted)
{
output.AppendLine(lineTask.Result);
Debug.WriteLine(lineTask.Result);
lineTask = process.StandardOutput.ReadLineAsync();
}
if (errorTask.IsCompleted)
{
error.AppendLine(errorTask.Result);
Debug.WriteLine(errorTask.Result);
errorTask = process.StandardError.ReadLineAsync();
}
errorTask.Wait(TimeSpan.FromMilliseconds(100.0));
lineTask.Wait(TimeSpan.FromMilliseconds(100.0));
}
在此之后,我正在进一步阅读流,看看那里是否还有什么。
我输出的空字符串和一个命令的错误。我唯一正确的是'ExitCode'。
请告诉我是否有什么我做错了。
答案 0 :(得分:1)
你的问题过于宽泛,因为它缺少细节,而且“我做错了什么”#34;"是开放式的。
那就是说,你正在以错误的方式读取流,因为你不应该轮询。我没有看到任何会导致您(模糊地)描述的行为的具体原因。但为了以防万一,我提供了正确的阅读实现:
async Task ConsumeStream(StreamReader reader, StringBuilder builder)
{
string line;
while ((line = await reader.ReadLineAsync()) != null)
{
builder.AppendLine(line);
Debug.WriteLine(line);
}
}
然后像这样调用这个方法:
var errorTask = ConsumeStream(process.StandardError, error);
var lineTask = ConsumeStream(process.StandardOutput, output);
// Technically superfluous, since you'll also wait on the tasks,
// but won't hurt.
process.WaitForExit();
Task.WaitAll(errorTask, lineTask);
// error and output StringBuilders will be valid here
如果这没有帮助,您需要发布一个更好的代码示例,这将允许其他人重现实际问题。见https://stackoverflow.com/help/mcve
答案 1 :(得分:1)
正如在IRC上所讨论的那样,您调用的程序可能已经写入除标准输出或标准错误之外的流。 Windows上还有数字为3-9的流。
您所拨打的流程并非如此。它实际上是使用Win32调用' WriteConsole',它似乎直接访问控制台。
可以通过预加载DLL(DLL注入)将输出移回stderr,但这是hackish,因此当程序的源可用时,它可能更好地修复& #39;它或向作者提交补丁。