【发布时间】:2012-05-02 14:28:50
【问题描述】:
背景:我正在努力将命令行和批处理功能添加到现有的 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 这么难? p>
我知道我可以在项目设置中将应用程序类型更改为 控制台应用程序,但这有一个令人讨厌的副作用 - 控制台窗口始终可见,即使您只是双击 exe。 This solution 也不会这样做,因为它会创建一个新的控制台,即使应用程序是从 cmd 运行的。
编辑:澄清一下,我希望我的应用程序输出到 现有 控制台(如果有),不如果缺少则创建一个新控制台。 p>
【问题讨论】:
-
这个问题的链接已经在我问题的最后一段了。
标签: c# wpf batch-file cmd