標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

PowerShell で (Go言語のように) リダイレクトされてたら、標準出力を UTF8 化する

注意:PowerShell 7 でしか検証してません

$saveEncode = $null
if ([Console]::IsOutputRedirected) {
    $saveEncode = [System.Console]::OutputEncoding
    [System.Console]::OutputEncoding=[System.Text.Encoding]::UTF8
}

# ... 中略 ...

if ( $saveEncode -ne $null ){
    [System.Console]::OutputEncoding=$saveEncode
}

なお、タイトルでは「(Go言語のように)」と述べているが、正確にいうと Go言語では「リダイレクトされてたらそのまま出力、ターミナルだったら UTF16 化」なので、PowerShell のそれとはちょっと違う。

例:

追記 2025-10-26

こういう動作になるところを見ると、デフォルトでは UTF16 でコンソールに出し、リダイレクトする時は ANSI で出力するという動作なのかもしれない。となると、案外、今回の記事のとおりにすることで、Go言語互換になっているのかもしれない。

> pwsh -Command "Write-Host '👨‍🌾'"
👨‍🌾

> pwsh -Command "Write-Host '👨‍🌾'" | cat
?????

> pwsh -Command "Write-Host '👨‍🌾'" | nkf32 --guess
ASCII (CRLF)