Powershell 正确编码 exe 输出

问题描述 投票:0回答:2

我用谷歌搜索了很多,但没有找到解决我的问题的方法。我想从 powershell 调用 exe 并捕获输出。我想在控制台中正确显示此输出并将其写入文件:

$output = & ".\myExe.exe" $path
Write-Host $output
$output | Out-File -Append -Encoding UTF8 -filepath $destFile

这只适用于非特殊字符。但是如果输出包含例如元音变音 (ä,ö,ü) 不起作用。然后我得到这样的东西:õ÷³

请问有人可以帮忙吗?

powershell encoding
2个回答
3
投票

我使用

 解决了 
git

输出的类似问题
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8

更新

其实我暂时改变编码只是为了调用

git

function Invoke-Git($Command) {
    ${*OutputEncoding} = [Console]::OutputEncoding
    [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
    try {
        . $Command
        if ($LASTEXITCODE) {Write-Error "Exit code: $LASTEXITCODE. Command: $Command" -ErrorAction 1}
    }
    finally {
        [Console]::OutputEncoding = ${*OutputEncoding}
    }
}

因此,如果更改编码会给其他命令带来问题,那么请尝试使用此方法。


2
投票

公然的mojibake案例。让我们进行下一个测试脚本,其中简单的控制台应用程序

CliParser.exe
会回显命令行参数(用
C
编写,灵感来自于 here

$destFile="d:\test\35909655-UTF8.txt"
Remove-Item $destFile
###
### [Console]::OutputEncoding = [System.Text.Encoding]::Default
###
$output = & "d:\bat\CliParser.exe" äöü
$output | Out-File -Append -Encoding UTF8 -filepath $destFile
"{0} {1} {2}" -f "Console code pages", [System.Console]::OutputEncoding.WindowsCodePage,
                                       [System.Console]::OutputEncoding.CodePage
"{0} {1} {2}" -f "System  code pages", [System.Text.Encoding]::Default.WindowsCodePage, 
                                       [System.Text.Encoding]::Default.CodePage

输出在不同情况下显示代码页存在差异;输出文件经过

UTF-8
编码,因此无论活动代码页如何,
get-content
都会正确显示它(请参阅下面的
chcp 437
):

==> chcp 850
Active code page: 850

==> powershell D:\PShell\SO\35909655.ps1
Console code pages 1252 850
System  code pages 1250 1250

==> powershell get-content "d:\test\35909655-UTF8.txt"
param 0 = D:\bat\CliParser.exe
param 1 = õ÷³

==> chcp 1250
Active code page: 1250

==> powershell D:\PShell\SO\35909655.ps1
Console code pages 1250 1250
System  code pages 1250 1250

==> chcp 437
Active code page: 437

==> powershell get-content "d:\test\35909655-UTF8.txt"
param 0 = D:\bat\CliParser.exe
param 1 = äöü

==>

请忘记,在上面的输出中出现了代码页

1252
(这只是 my 默认值)。

答案:要在Powershell脚本中处理这种情况,请使用(删除前导

###

[Console]::OutputEncoding = [System.Text.Encoding]::Default
© www.soinside.com 2019 - 2024. All rights reserved.