tee with utf-8 encoding

One option is to use Add-Content or Set-Content instead of Out-File.

The *-Content cmdlets use ASCII encoding by default, and have a -Passthru switch so you can write to the file, and then have the input pass through to the console:

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

Tee-object seems to invoke out-file, so this will make tee output utf8:

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

You would have to use -Variable and then write it out to a file in a separate step.

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

At first glance it seems like it's easier to avoid tee altogether and just capture the output in a variable, then write it to the screen and to a file.

But because of the way the pipeline works, this method allows for a long running pipeline to display data on screen as it goes along. Unfortunately the same cannot be said for the file, which won't be written until afterwards.

Doing Both

An alternative is to roll your own tee so to speak:

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

That will write to the file and back to the pipeline, and it will happen as it goes along. It's probably quite slow though.