我正在开发一个Windows窗体应用程序,它要求我调用一个单独的程序来执行任务.该程序是一个控制台应用程序,我需要将标准输出从控制台重定向到我的程序中的TextBox.
从我的应用程序执行程序没有问题,但我不知道如何将输出重定向到我的应用程序.我需要在程序使用事件运行时捕获输出.
在我的应用程序停止并且文本以随机间隔不断变化之前,控制台程序并不意味着停止运行.我试图做的只是从控制台挂钩输出以触发事件处理程序,然后可以使用它来更新TextBox.
我使用C#编写程序代码并使用.NET框架进行开发.原始应用程序不是.NET程序.
编辑:这是我正在尝试做的示例代码.在我的最终应用程序中,我将用代码替换Console.WriteLine来更新TextBox.我试图在我的事件处理程序中设置断点,甚至没有达到.
void Method()
{
var p = new Process();
var path = @"C:\ConsoleApp.exe";
p.StartInfo.FileName = path;
p.StartInfo.UseShellExecute = false;
p.OutputDataReceived += p_OutputDataReceived;
p.Start();
}
static void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(">>> {0}", e.Data);
}
Run Code Online (Sandbox Code Playgroud) 无论如何,重定向生成的进程的标准输出并将其捕获为它的发生.我看到的所有内容在完成此过程后都会执行ReadToEnd.我希望能够在打印时获得输出.
编辑:
private void ConvertToMPEG()
{
// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
//Setup filename and arguments
p.StartInfo.Arguments = String.Format("-y -i \"{0}\" -target ntsc-dvd -sameq -s 720x480 \"{1}\"", tempDir + "out.avi", tempDir + "out.mpg");
p.StartInfo.FileName = "ffmpeg.exe";
//Handle data received
p.OutputDataReceived += new DataReceivedEventHandler(p_OutputDataReceived);
p.Start();
}
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Debug.WriteLine(e.Data);
}
Run Code Online (Sandbox Code Playgroud) 我有一个函数,我可以在其中使用&操作员调用应用程序。该应用程序生成几行命令行输出,下载一些文件,并返回一个字符串:
& "app.exe" | Out-Host
$var = ...
return $var
Run Code Online (Sandbox Code Playgroud)
看来,控制台上app.exe只会出现终止后产生的输出app.exe。用户没有任何实时信息正在下载哪个文件。app.exe有没有办法在运行时不断更新控制台?
我正在开发一个 C# 应用程序,需要运行外部控制台进程(例如 python 脚本)并实时接收脚本的输出数据。python 脚本是这样的:
import time
while 1:
print("Hi Foo!")
time.sleep(.3)
Run Code Online (Sandbox Code Playgroud)
以下 C# 代码在 C# 控制台上实时打印 python 脚本输出:
static void Main(string[] args)
{
using (Process process = new Process())
{
process.StartInfo.FileName = "python.exe";
process.StartInfo.Arguments = "test.py";
process.StartInfo.UseShellExecute = false;
process.Start();
process.WaitForExit();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试捕获输出数据并手动将它们写入控制台时,我失败了。根据其他帖子推荐的解决方案是这样的,但它不起作用:
static void Main(string[] args)
{
using (Process process = new Process())
{
process.StartInfo.FileName = "python.exe";
process.StartInfo.Arguments = "test.py";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += (s, e) => Console.WriteLine(e.Data);
process.Start(); …Run Code Online (Sandbox Code Playgroud) 我正在运行一个具有大运行时间和大输出的程序,因此为了在查看输出时进行日志记录,我tee在 windows 上使用命令cmd.exe:
./program | tee -a program.log
的program打印输出住(具有显着的时间间隙行之后线),但是tee打印仅输出程序终止之后。有什么方法可以tee与实时输出一起使用吗?
注意:该问题在 windows 上也仍然存在 powershell.exe