Powershell - 奇怪的 WSL 输出字符串编码

Séb*_*ert 5 powershell windows-subsystem-for-linux

今天我只是想检查我的 Windows 工作站上是否安装了特定的子系统。因此,我使用 Windows Subsystem for Linux (WSL) 并安装可从 Microsoft Store 获取的 Ubuntu。现在我试图找到一种方法来检查它是否以编程方式安装。

我有这个输出:

PS C:\> wsl -l -v
NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2
Run Code Online (Sandbox Code Playgroud)

我需要知道是否安装了“Ubuntu-20.04”。我尝试过很多事情,但没有什么相关的,例如:

$state = wsl -l -v
if($state -like '*Ubuntu*') {
      Write-Host 'Installed'
} else {
      Write-Host 'Nope'
}
Run Code Online (Sandbox Code Playgroud)

但不工作。你有线索给我吗?感谢大家 !

mar*_*sze 6

这似乎是一个编码问题。字符串中有(不可见的)空字符。我仍在尝试找出处理它的最佳方法。

与此同时......这里有一个快速解决方案:

$state = (wsl -l -v) -replace "\x00",""
Run Code Online (Sandbox Code Playgroud)

更新

另一种解决方法,但这将更改整个会话的编码:

[System.Console]::OutputEncoding = [System.Text.Encoding]::Unicode
Run Code Online (Sandbox Code Playgroud)


Not*_*1ds 5

您的示例代码现在可以在最新的 WSL 预览版 ( 0.64.0 ) 中选择加入修复程序正常工作,但请注意(至少在预览版中)它仅适用于 Windows 11 用户。

要选择加入(以便在实现像前面的答案这样的解决方法时不会意外破坏旧代码),只需将环境变量设置WSL_UTF8为值1(只有该值有效)。

例如,从 PowerShell:

$env:WSL_UTF8=1
Run Code Online (Sandbox Code Playgroud)

或者,如果需要,您可以在 Windows 中进行全局设置。

wsl.exe如果从WSL 本身内部运行,请参阅此答案以获取使用WSLENV.