在变量中存储 cmdlet 响应时出现 PowerShell 编码问题

Arb*_*ter 2 powershell encoding character-encoding powershell-cmdlet

我花了大约一个小时试图弄清楚这里发生了什么,但我根本无法找出原因,也没有意外地找到解决方法。

\n

当我运行时,winget upgrade返回的数据已正确编码:

\n

winget 响应已正确编码

\n

然而,如果我将 winget 升级的响应存储在变量 ( $winget = winget upgrade; $winget;) 中,某些字符会中断,这似乎是一个编码问题:

\n

winget 响应中有编码问题

\n

像这样的 cmdlet 将始终将字符串返回到 PowerShell,因此我猜想将响应分配给变量正在应用一些默认文本编码,也许来自我的 PowerShell 配置文件?我已经尝试将大多数常见代码投射到变量上,但最终会完全破坏数据。

\n

我什至以每种可能的编码类型转储了数据,但它们都已损坏:

\n
winget upgrade | Out-File -FilePath C:\\tmp\\test1.txt -Encoding ascii\nwinget upgrade | Out-File -FilePath C:\\tmp\\test3.txt -Encoding default\nwinget upgrade | Out-File -FilePath C:\\tmp\\test4.txt -Encoding string\nwinget upgrade | Out-File -FilePath C:\\tmp\\test5.txt -Encoding unicode\nwinget upgrade | Out-File -FilePath C:\\tmp\\test7.txt -Encoding utf32\nwinget upgrade | Out-File -FilePath C:\\tmp\\test8.txt -Encoding utf7\nwinget upgrade | Out-File -FilePath C:\\tmp\\test9.txt -Encoding utf8\n
Run Code Online (Sandbox Code Playgroud)\n

我已设法通过重新编码字符串来影响错误字符,但尚未解决问题:

\n
$originalBytes = [Text.Encoding]::Default.GetBytes(\'Microsoft Visual C++ 2013 Redistributable (x6\xc3\x94\xc3\x87\xc2\xaa\')\n[Text.Encoding]::Utf8.GetString($originalBytes)\n
Run Code Online (Sandbox Code Playgroud)\n

在此输入图像描述

\n

Arb*_*ter 5

感谢 @JosefZ 分享解决方案,可以在此处找到该解决方案:如何配置 Powershell 控制台的编码?

\n

这是以下的输出[console]::OutputEncoding

\n
PS C:\\> [console]::OutputEncoding                             \n                                                              \n                                                              \nIsSingleByte      : True                                      \nBodyName          : ibm850                                    \nEncodingName      : Western European (DOS)                    \nHeaderName        : ibm850                                    \nWebName           : ibm850                                    \nWindowsCodePage   : 1252                                      \nIsBrowserDisplay  : False                                     \nIsBrowserSave     : False                                     \nIsMailNewsDisplay : False                                     \nIsMailNewsSave    : False                                     \nEncoderFallback   : System.Text.InternalEncoderBestFitFallback\nDecoderFallback   : System.Text.InternalDecoderBestFitFallback\nIsReadOnly        : True                                      \nCodePage          : 850                                       \n
Run Code Online (Sandbox Code Playgroud)\n

这是以下的输出[Console]::Out

\n
PS C:\\> [Console]::Out                                 \n                                                       \nEncoding                         FormatProvider NewLine\n--------                         -------------- -------\nSystem.Text.SBCSCodePageEncoding en-GB          ...    \n
Run Code Online (Sandbox Code Playgroud)\n

使用将我的控制台输出更改为 UTF-8[Console]::OutputEncoding = [System.Text.Encoding]::UTF8解决了该问题。

\n

现在,当我将 cmdlet 响应存储在变量中时,一切都正常了:

\n
PS C:\\> [Console]::OutputEncoding = [System.Text.Encoding]::UTF8 \nPS C:\\> $winget = winget upgrade                                 \nPS C:\\> $winget \nName                                           Id                                    Version       Available     Source\n-----------------------------------------------------------------------------------------------------------------------\nSignal                                         OpenWhisperSystems.Signal             5.20.0        5.23.1        winget\nCisco Webex Meetings                           Cisco.CiscoWebexMeetings              41.9.5        41.12.2.15    winget\nAudacity                                       Audacity.Audacity                     3.0.4         3.1.2         winget\nDocker Desktop                                 Docker.DockerDesktop                  4.1.1         4.2.0         winget\nGit                                            Git.Git                               2.33.0.2      2.34.0        winget\nMongoDB Compass                                MongoDB.Compass.Full                  1.28.4        1.29.4.0      winget\nTeamViewer                                     TeamViewer.TeamViewer                 15.22.3       15.23.9       winget\nVisual Studio Community 2019                   Microsoft.VisualStudio.2019.Community 16.11.3       16.11.7       winget\nInsomnia                                       Insomnia.Insomnia                     2021.5.3      2021.6.0      winget\nMicrosoft Visual C++ 2013 Redistributable (x6\xe2\x80\xa6 Microsoft.VC++2013Redist-x64          12.0.30501.0  12.0.40664.0  winget\nMicrosoft Visual C++ 2015-2019 Redistributabl\xe2\x80\xa6 Microsoft.VC++2015-2019Redist-x64     14.29.30133.0 14.29.30135.0 winget\nMicrosoft Visual C++ 2015-2019 Redistributabl\xe2\x80\xa6 Microsoft.VC++2015-2019Redist-x86     14.29.30133.0 14.29.30135.0 winget\nNode.js LTS                                    OpenJS.NodeJS.LTS                     14.17.6       16.13.0       winget\nMicrosoft Visual C++ 2015-2019 Redistributabl\xe2\x80\xa6 Microsoft.VC++2015-2019Redist-x64     14.28.29914.0 14.29.30135.0 winget\nScreenToGif                                    NickeManarin.ScreenToGif              2.33.1        2.34.1        winget\nMongoDB                                        MongoDB.Server                        5.0.2         5.1.0         winget\nAWS Command Line Interface                     Amazon.AWSCLI                         2.2.46.0      2.3.7.0       winget\nChrome Remote Desktop Host                     Google.ChromeRemoteDesktop            92.0.4515.41  96.0.4664.39  winget\nMicrosoft Visual C++ 2013 Redistributable (x8\xe2\x80\xa6 Microsoft.VC++2013Redist-x86          12.0.30501.0  12.0.40664.0  winget\n19 upgrades available.                                                                                                                                                  \n
Run Code Online (Sandbox Code Playgroud)\n

  • @DougMaurer 我非常喜欢这个社区:) (2认同)