我正在尝试捕获从PowerShell运行的npm的标准输出。 Npm下载丢失的包并输出适当的树。
它看起来像什么:
这是正确的输出。
当我尝试从PowerShell执行相同操作并捕获结果时,我无法获得相同的字符:
使用
时也一样gpm install | Tee-Object -FilePath
或gpm install | Out-File -FilePath .. -Encoding Unicode # or Utf8
$a = gpm install
如何在PowerShell中正确捕获输出?
答案 0 :(得分:5)
PowerShell是一个基于对象的shell,具有基于对象的管道,但对于本机应用程序,管道是基于字节流的。因此,PowerShell在从/向本机应用程序传递数据时必须从/转换为字节流。即使将数据从一个本机应用程序传输到另一个本机应用程序或将本机应用程序的输出重定向到文件,也会发生此转换。
当PowerShell从本机应用程序接收数据时,它将字节流解码为字符串,并按换行符分割该字符串。为了将字节流解码为字符串,PowerShell使用控制台的输出编码:[Console]::OutputEncoding
。如果您知道应用程序使用不同的输出编码,则可以显式更改控制台的输出编码以匹配您的应用程序:
[Console]::OutputEncoding=[Text.Encoding]::UTF8
当PowerShell将数据传递给本机应用程序时,它会使用$OutputEncoding
首选项变量中指定的编码将对象转换为字符串。