我在这上面花了一些时间并且成功了。我在研究过程中发现了这个博客,并决定返回并提供我的解决方案,以节省下一个人的时间。我以访客身份回复一封虚假电子邮件,因此我不会进行互动,但不需要进一步的信息。
2012 年 7 月 18 日 19:41 Harry Johnston 写道:
“原则上,如果您知道需要多少数据,您可以使用控制台 API 函数创建一个控制台供应用程序写入,然后从控制台读取输出。但是您不能在 Java 中做到这一点,您需要编写一个 C 应用程序来为您完成此操作。”
事实是,已经有一个实用程序可以做到这一点。它的编写用途略有不同,但可以通过操纵来提供所需的结果。其预期目的是使 Windows 控制台应用程序能够与 Linux 风格的 tty 终端进行交互。它通过运行隐藏控制台并直接访问控制台缓冲区来实现此目的。如果你尝试使用它——你就会失败。我很幸运,发现这个实用程序有未记录的开关,这将允许它提供简单的无缓冲输出。如果没有这些开关,当尝试通过管道输出时,它会失败并出现错误 - 输出不是 tty。
该实用程序称为 winpty。你可以在这里得到它:
https://github.com/rprichard/winpty/releases https://github.com/rprichard/winpty/releases
这里提到了未记录的开关:
https://github.com/rprichard/winpty/issues/103 https://github.com/rprichard/winpty/issues/103
我用的是MSYS2版本。您需要 msys-2.0.dll 才能使用它。
只需运行:
winpty.exe -Xallow-non-tty -Xplain your_program.exe | receive_unbuffered_output.exe
-Xallow-non-tty
,将允许管道输出
-Xplain
,将删除添加的 Linux 终端转义码(或任何名称)
所需文件有:
winpty.exe
winpty-agent.exe
winpty.dll
msys-2.0.dll
winpty-debugserver.exe – 不需要