Out-Host 是否正在缓冲?

rob*_*ert 3 powershell

我有一个函数,我可以在其中使用&操作员调用应用程序。该应用程序生成几行命令行输出,下载一些文件,并返回一个字符串:

& "app.exe" | Out-Host
$var = ...
return $var
Run Code Online (Sandbox Code Playgroud)

看来,控制台上app.exe只会出现终止后产生的输出app.exe。用户没有任何实时信息正在下载哪个文件。app.exe有没有办法在运行时不断更新控制台?

use*_*407 5

许多控制台应用程序会缓冲其输出流(如果已知会重定向)。实际上,这是 C 库的标准行为。因此,app.exe由于重定向,缓冲是在 上完成的,而不是由 完成的Out-Host。

解决方案是不重定向 的输出app.exe,即使外部命令重定向也是如此。因此,您应该知道PowerShell 不重定向控制台应用程序的输出流并将其直接链接到它们自己的输出流(这将是用于交互式会话的控制台)时的确切情况。条件是:PowerShell.exe

  1. 命令是管道中的最后一项。
  2. 命令通过管道传送到Out-Default.

解决方案是将命令包装到脚本块中,并将该脚本块通过管道传输到Out-Default:

& { & "app.exe" } | Out-Default
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是使用带有和参数的Start-Processcmdlet :-NoNewWindow-Wait

Start-Process "app.exe" -NoNewWindow -Wait
Run Code Online (Sandbox Code Playgroud)