Powershell正确编译exe-output

时间:2016-03-10 06:59:21

标签: powershell encoding

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

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

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

有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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}
    }
}

因此,如果更改编码会导致其他命令出现问题,那么请尝试使用此方法。

答案 1 :(得分:1)

公然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(它只是我的默认值)。

回答:要在Powesthell脚本中处理案例,请使用(删除前导###

[Console]::OutputEncoding = [System.Text.Encoding]::Default