我用谷歌搜索了很多,但没有找到解决我的问题的方法。我想从 powershell 调用 exe 并捕获输出。我想在控制台中正确显示此输出并将其写入文件:
$output = & ".\myExe.exe" $path
Write-Host $output
$output | Out-File -Append -Encoding UTF8 -filepath $destFile
这只适用于非特殊字符。但是如果输出包含例如元音变音 (ä,ö,ü) 不起作用。然后我得到这样的东西:õ÷³
请问有人可以帮忙吗?
我使用
解决了
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}
}
}
因此,如果更改编码会给其他命令带来问题,那么请尝试使用此方法。
公然的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