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
今天我只是想检查我的 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