注意: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)