如何像 Linux 一样通过 cmd 运行带有输出的 exe

如何像 Linux 一样通过 cmd 运行带有输出的 exe

通过在 中输入此内容来在 Windows 中运行程序cmd.exe

./myapp.exe

然后程序看起来就像在另一个线程中运行,与 cmd 不同的线程。如何让程序通过 cmd 运行,就像 Linux 风格一样。当 cmd 终端销毁时,正在运行的程序也会终止。在程序运行时,cmd 将按时捕获 std 输出。

答案1

然后程序看起来就像在另一个线程中运行,与cmd不同的线程。

嗯,该程序在一个单独的过程,它有自己的线程。

在 Windows 上,主要有两种类型的程序:控制台和窗口。

控制台程序通常是打印文本的文本模式应用程序。这些程序已经按照您想要的方式运行:您运行程序,shell ( cmd.exe) 等待程序完成,然后返回到交互式提示符。如果程序长时间运行,强制终止cmd.exe将终止程序。

窗口程序通常是具有图形用户界面的应用程序(例如notepad.exe,,)。它们的行为并不如您所愿:当您通过 运行它们时explorer.exe,不会等待它们并立即返回到交互式提示。执行的程序独立于 运行,终止其中一个不会对另一个产生影响。firefox.execmd.execmd.execmd.exe

请注意控制台程序有窗口和窗口程序有控制台输出。那么是什么让程序成为“控制台”或“窗口”呢?

部分.exe指定是否应使用“控制台”运行子系统或者使用“windows”子系统。这是在程序构建时配置的(通常是隐式的)。这在程序构建后可以更改;editbin.exe(包含在 Visual Studio 中)可以修改.exe文件并更改程序应使用的子系统。

如果您只想查看 stdout 和 stderr 输出,则无需修改文件.exe。通常,窗口应用程序不会将该输出发送到任何地方,但您可以使用管道/重定向来更改这一点。例如,您可以运行:

SomeWindowedApplication.exe > output.txt

或者,如果你有cat(或同等的)可用:

SomeWindowedApplication.exe | cat

这样做还会导致cmd.exe等待程序终止,然后才返回到交互提示符。请注意,这确实不是具有您想要的终止行为(即,cmd.exe在最后一个示例中终止将终止cat.exe,而不是ShowWindowedApplication.exe)。

另请参阅:

答案2

直接回答基于@jamesdlin 的回答

在 powershell 中运行:

$ ./myapp.exe | echo

相关内容