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

Powershell - Strange WSL output string encoding

今天我只是想检查我的 windows 工作站上是否安装了特定的子系统。 因此,我正在为 Linux (WSL) 使用 Windows 子系统,并安装 Microsoft Store 提供的 Ubuntu。 现在我想找到一种方法来检查它是否以编程方式安装。

我有这个输出:

PS C:\> wsl -l -v
NAME            STATE           VERSION
* Ubuntu-20.04    Stopped         2

而且我需要知道是否安装了“Ubuntu-20.04”。 我已经尝试了很多东西,但没有什么像这样的:

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

但是没有用。 你有线索给我吗? 谢谢大家!

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

与此同时...这里有一个快速修复:

$state = (wsl -l -v) -replace "\x00",""

更新

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

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

如果你是运行wsl来自WSL本身或者WindowsGitBash,你可以用这个来转换:

wsl -l -v | iconv -f UTF-16LE -t UTF-8