如何匹配powershell中的wsl输出?

问题描述

我想看看我是否正在运行特定的 wsl 发行版(Windows 10 Home、WSL 2):

PS C:\Users\User> wsl --list --running
Windows Subsystem for Linux distributions:
Ubuntu (Default)
Mydistro
PS C:\Users\User> wsl --list --running | Select-String -Pattern "Mydistro"
PS C:\Users\User>

输出。我用 Get-Member 看到输出一个字符串;如果我通过 | Out-String -stream 之类的东西运行它,它没有区别。

可以匹配 Select-String .Select-String .* 但它匹配所有内容,这没有帮助。

是的,我想看看是否有特定名称的正在运行的发行版。在 PowerShell 中是否有更好的方法来做到这一点?

解决方法

令人费解的是,wsl --list --running 生成 UTF-16LE 编码(“Un​​icode”编码)输出,而不是遵守控制台 (OEM) 代码页。

一个快速而肮脏的解决方法 - 假设所有正在运行的发行版都只用 ASCII-range 字符描述(这似乎很可能) - 是使用以下内容:

(wsl --list --running) -replace "`0" | Select-String -Pattern MyDistro

支持所有 Unicode 字符的正确解决方法需要更多的努力:

$prev = [Console]::OutputEncoding; [Console]::OutputEncoding = [System.Text.Encoding]::Unicode
wsl --list --running | Select-String -Pattern MyDistro
[Console]::OutputEncoding = $prev