我花了最后一個小時左右試圖弄清楚這里發生了什么,但我根本無法找出原因,也沒有偶然發現解決方法。
當我運行時winget upgrade,回傳的資料被正確編碼:

然而,如果我將 winget upgrade 的回應存盤在變數 ( $winget = winget upgrade; $winget;) 中,一些字符會中斷,這似乎是一個編碼問題:

像這樣的 cmdlet 總是將字串回傳給 PowerShell,所以我猜將回應分配給變數是應用一些默認文本編碼,也許來自我的 PowerShell 組態檔?我已經嘗試將大部分常用代碼強制轉換為變數,但最終會完全破壞資料。
我什至將所有可能的編碼型別的資料都轉儲出來,但它們都壞了:
winget upgrade | Out-File -FilePath C:\tmp\test1.txt -Encoding ascii
winget upgrade | Out-File -FilePath C:\tmp\test3.txt -Encoding default
winget upgrade | Out-File -FilePath C:\tmp\test4.txt -Encoding string
winget upgrade | Out-File -FilePath C:\tmp\test5.txt -Encoding unicode
winget upgrade | Out-File -FilePath C:\tmp\test7.txt -Encoding utf32
winget upgrade | Out-File -FilePath C:\tmp\test8.txt -Encoding utf7
winget upgrade | Out-File -FilePath C:\tmp\test9.txt -Encoding utf8
我設法通過重新編碼字串來影響錯誤字符,但 bt 還沒有解決問題:
$originalBytes = [Text.Encoding]::Default.GetBytes('Microsoft Visual C 2013 Redistributable (x6??a')
[Text.Encoding]::Utf8.GetString($originalBytes)

uj5u.com熱心網友回復:
感謝@JosefZ 分享解決方案,可在此處找到:如何配置 Powershell 控制臺的編碼?
這是輸出[console]::OutputEncoding:
PS C:\> [console]::OutputEncoding
IsSingleByte : True
BodyName : ibm850
EncodingName : Western European (DOS)
HeaderName : ibm850
WebName : ibm850
WindowsCodePage : 1252
IsBrowserDisplay : False
IsBrowserSave : False
IsMailNewsDisplay : False
IsMailNewsSave : False
EncoderFallback : System.Text.InternalEncoderBestFitFallback
DecoderFallback : System.Text.InternalDecoderBestFitFallback
IsReadOnly : True
CodePage : 850
這是輸出[Console]::Out:
PS C:\> [Console]::Out
Encoding FormatProvider NewLine
-------- -------------- -------
System.Text.SBCSCodePageEncoding en-GB ...
使用將我的控制臺輸出更改為 UTF-8[Console]::OutputEncoding = [System.Text.Encoding]::UTF8解決了這個問題。
現在,當我將 cmdlet 回應存盤在一個變數中時,一切正常:
PS C:\> [Console]::OutputEncoding = [System.Text.Encoding]::UTF8
PS C:\> $winget = winget upgrade
PS C:\> $winget
Name Id Version Available Source
-----------------------------------------------------------------------------------------------------------------------
Signal OpenWhisperSystems.Signal 5.20.0 5.23.1 winget
Cisco Webex Meetings Cisco.CiscoWebexMeetings 41.9.5 41.12.2.15 winget
Audacity Audacity.Audacity 3.0.4 3.1.2 winget
Docker Desktop Docker.DockerDesktop 4.1.1 4.2.0 winget
Git Git.Git 2.33.0.2 2.34.0 winget
MongoDB Compass MongoDB.Compass.Full 1.28.4 1.29.4.0 winget
TeamViewer TeamViewer.TeamViewer 15.22.3 15.23.9 winget
Visual Studio Community 2019 Microsoft.VisualStudio.2019.Community 16.11.3 16.11.7 winget
Insomnia Insomnia.Insomnia 2021.5.3 2021.6.0 winget
Microsoft Visual C 2013 Redistributable (x6… Microsoft.VC 2013Redist-x64 12.0.30501.0 12.0.40664.0 winget
Microsoft Visual C 2015-2019 Redistributabl… Microsoft.VC 2015-2019Redist-x64 14.29.30133.0 14.29.30135.0 winget
Microsoft Visual C 2015-2019 Redistributabl… Microsoft.VC 2015-2019Redist-x86 14.29.30133.0 14.29.30135.0 winget
Node.js LTS OpenJS.NodeJS.LTS 14.17.6 16.13.0 winget
Microsoft Visual C 2015-2019 Redistributabl… Microsoft.VC 2015-2019Redist-x64 14.28.29914.0 14.29.30135.0 winget
ScreenToGif NickeManarin.ScreenToGif 2.33.1 2.34.1 winget
MongoDB MongoDB.Server 5.0.2 5.1.0 winget
AWS Command Line Interface Amazon.AWSCLI 2.2.46.0 2.3.7.0 winget
Chrome Remote Desktop Host Google.ChromeRemoteDesktop 92.0.4515.41 96.0.4664.39 winget
Microsoft Visual C 2013 Redistributable (x8… Microsoft.VC 2013Redist-x86 12.0.30501.0 12.0.40664.0 winget
19 upgrades available.
uj5u.com熱心網友回復:
我知道你說過替換字符不是一種選擇。我很想知道你想出了什么。對于我們其他人,這里有一些代碼可以將 的輸出winget upgrade轉換為可用物件。
(winget upgrade) -replace 'Γ?a|a€||…',' ' | ForEach-Object {
if($_ -match '(. ?)\s{2,}(. ?)\s (\S )\s (\S )\s (\S )$'){
$Matches[1..5] -join '|'
}
} | ConvertFrom-Csv -Delimiter '|'
這是串列形式的默認輸出
Name : Cisco Webex Meetings
Id : Cisco.CiscoWebexMeetings
Version : 41.9.5
Available : 41.12.2.15
Source : winget
Name : Discord
Id : Discord.Discord
Version : 0.0.309
Available : 1.0.9003
Source : winget
Name : GitHub Desktop
Id : GitHub.GitHubDesktop
Version : 2.9.0
Available : 2.9.4
Source : winget
并且在使用時 Format-Table
Name Id Version Available Source
---- -- ------- --------- ------
Visual Studio Community 2019 Microsoft.VisualStudio.2019.Community 16.10.31410.357 16.11.7 winget
Cisco Webex Meetings Cisco.CiscoWebexMeetings 41.9.5 41.12.2.15 winget
Discord Discord.Discord 0.0.309 1.0.9003 winget
我已經在 5.1、7.2、ISE 和 Visual Studio Code 中進行了測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/362447.html
上一篇:以紅色寫入空值
下一篇:我如何多次內部加入和分組?
