2016-03-10 92 views
2

的正確的編碼我用Google搜索了很多,但我沒有找到我的問題的解決方案。我想從powershell調用一個exe文件並捕獲輸出。這個輸出我想在控制檯中正確顯示並寫入文件:Powershell的EXE輸出

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

這隻適用於非特殊字符。但是如果輸出包含例如一個變音符(ä,ö,ü)它不起作用。然後,我得到這樣的:ø÷³

誰能幫助嗎?

+0

這應該工作。也許文件已經存在,並使用不同的編碼。刪除'$ destFile'並重試。 –

+0

刪除$ destFile沒有幫助。 – wima

回答

2

我解決了類似的問題,使用

git輸出
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8 

UPDATE

其實,我臨時改變編碼只是爲了打電話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} 
    } 
} 

因此,如果改變編碼會爲其他命令提出問題,然後嘗試使用此方法。

+0

這導致一個錯誤: 寫主機:Win32的內部錯誤「連接到系統A設備工作不正常」 0x1F的,而在當前光標位置寫入 到控制檯輸出緩衝器發生。與Microsoft客戶支持服務聯繫。 – wima

+0

然後嘗試更改編碼只是一個電話,然後將其還原。查看更新後的答案。 –

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 
+0

所以我們可以同時使用'[System.Console] :: OutputEncoding'和'chcp'?儘管第一個不是第二個,但我得到了它。認爲它應該通過Windows API設置相同的東西。你想說什麼? – Artyom