背景:我正在努力为现有的WPF Windows应用程序添加命令行和批处理功能。当我在启动时检测到某些选项时,我会抑制窗口出现,进行一些处理并立即退出。现在,因为没有UI界面,我想要将一些消息输出到stdout/stderr。请考虑以下代码:
namespace WpfConsoleTest
{
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
Console.WriteLine("Start");
System.Threading.Thread.Sleep(1000);
Console.WriteLine("Stop");
Shutdown(0);
}
}
}
当我在命令行中运行时,我期望看到以下输出:
Start
Stop
相反:
C:\test>WpfConsoleTest.exe
C:\test>
你可以重定向输出:
C:\test>WpfConsoleTest.exe > out.txt
C:\test>type out.txt
Start
Stop
遗憾的是,重定向到CON无法正常工作:
C:\test>WpfConsoleTest.exe > CON
C:\test>
另一个问题是WpfConsoleTest.exe在启动后立即退出。因此:
C:\test>WpfConsoleTest.exe > out.txt & type out.txt
C:\test>
但是:
C:\test>WpfConsoleTest.exe > out.txt & ping localhost > nul & type out.txt
Start
Stop
到目前为止,我能想到的最佳解决方案是使用
start /B /wait
:C:\test>start /B /wait WpfConsoleTest.exe > out.txt & type out.txt
Start
Stop
这种方法大多数情况下是可行的,如果将它包裹在一个批处理文件中,您可以保留错误代码等信息。但唯一的缺点是,应用程序结束后输出到终端,即无法跟踪进度,必须等待正在进行的操作完成。
因此,我的问题是:如何从WPF Windows应用程序输出到父控制台? 此外,为什么很难从WPF获取stdout / stderr?
我知道可以在项目设置中将应用程序类型更改为控制台应用程序,但这会有一个不好的副作用-即使您只是双击exe,控制台窗口也会一直显示。 这个解决方案 也不可行,因为它即使从cmd运行应用程序也会创建新的控制台。
编辑:为了澄清,我希望我的应用程序将输出到现有的控制台,如果存在的话,并且不要在缺少控制台时创建新的控制台。