使用 utf-8 编码的 tee

tee with utf-8 encoding

我正在尝试 tee 服务器的输出到控制台和 Powershell 4 中的文件。该文件以 UTF-16 编码结尾,这与我的其他一些工具不兼容我正在使用。根据 help tee -full

Tee-Object uses Unicode enocding when it writes to files.
...
To specify the encoding, use the Out-File cmdlet

因此 tee 不支持更改编码,并且 teeOut-File 的帮助没有显示任何拆分流并使用 UTF 编码的示例- 8.

Powershell 4 中是否有简单的方法 tee(或以其他方式拆分流)到具有 UTF-8 编码的文件?

您必须使用 -Variable,然后在单独的步骤中将其写入文件。

$data = $null
Get-Process | Tee-Object -Variable data
$data | Out-File -Path $path -Encoding Utf8

乍一看,完全避免 tee 并仅捕获变量中的输出,然后将其写入屏幕和文件似乎更容易。

但是由于管道的工作方式,此方法允许很长的 运行 管道在其运行过程中在屏幕上显示数据。不幸的是,文件不能这样说,直到之后才会写入。

两者兼顾

另一种方法是自己滚动 tee 可以这么说:

[String]::Empty | Out-File -Path $path  # initialize the file since we're appending later
Get-Process | ForEach-Object {
    $_ | Out-File $path -Append -Encoding Utf
    $_
}

这将写入文件并返回到管道,它会随着它的进行而发生。虽然它可能很慢。

一种选择是使用 Add-ContentSet-Content 而不是 Out-File

*-Content cmdlet 默认使用 ASCII 编码,并有一个 -Passthru 开关,因此您可以写入文件,然后将输入传递到控制台:

Get-Childitem -Name | Set-Content file.txt -Passthru

首先使用适当的标志创建文件,然后附加到它:

Set-Content  out $null -Encoding Unicode
...
cmd1 | tee out -Append
...
cmdn | tee out -Append

Tee-object 似乎调用了 out-file,所以这将使 tee 输出为 utf8:

$PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}