Out-Host缓冲?

时间:2016-11-08 13:03:19

标签: powershell

我有一个函数,我使用&运算符调用应用程序。该应用程序生成多行命令行输出,下载一些文件,并返回一个字符串:

& "app.exe" | Out-Host
$var = ...
return $var

似乎,在app.exe终止后,控制台上会显示由app.exe生成的输出。用户没有任何正在下载文件的实时信息。有没有办法在app.exe运行时不断更新控制台?

1 个答案:

答案 0 :(得分:2)

如果已知重定向,许多控制台应用程序会缓冲其输出流。实际上,it is standard behavior of C library。因此,由于重定向而导致app.exe完成缓存,但不是Out-Host

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

  1. 命令是管道中的最后一项。
  2. 命令通过管道传输到Out-Default
  3. 解决方案是将命令包装到脚本块中,并将该脚本阻塞到Out-Default

    & { & "app.exe" } | Out-Default
    

    另一种解决方案是将Start-Process cmdlet与-NoNewWindow-Wait参数一起使用:

    Start-Process "app.exe" -NoNewWindow -Wait