采用utf-8编码的T恤

Ang*_*gus 12 powershell encoding tee powershell-4.0

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

Tee-Object在写入文件时使用Unicode enocding.
...
要指定编码,请使用Out-File cmdlet

所以tee不支持更改编码,以及两者的帮助,tee并且Out-File不显示任何拆分流并使用UTF-8对其进行编码的示例.

在Powershell 4中有一种简单的方法tee(或以其他方式将流分割)到UTF-8编码的文件中吗?

mjo*_*nor 13

一种选择是使用Add-ContentSet-Content代替Out-File.

*-Contentcmdlet的默认使用ASCII编码,并有一个-Passthru开关,所以你可以写入文件,然后还要输入通过控制台:

Get-Childitem -Name | Set-Content file.txt -Passthru
Run Code Online (Sandbox Code Playgroud)

  • @majkinetor答案提到了"Add-Content",它用于追加.在刷掉答案之前请仔细阅读. (2认同)
  • 没人说是一样的。但是,它可以用于同一目的。尝试`dir | 出线 添加内容out1 -PassThru`。 (2认同)
  • 到目前为止,这是最好的解决方案,虽然不像tee它会锁定文件 (2认同)

js2*_*010 6

Tee-object 似乎调用了 out-file,因此这将使 tee 输出 utf8:

$PSDefaultParameterValues = @{'Out-File:Encoding' = 'utf8'}
Run Code Online (Sandbox Code Playgroud)


bri*_*ist 5

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

$data = $null
Get-Process | Tee-Object -Variable data
$data | Out-File -Path $path -Encoding Utf8
Run Code Online (Sandbox Code Playgroud)

乍一看,似乎更容易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
    $_
}
Run Code Online (Sandbox Code Playgroud)

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