如何匹配 powershell 中的 wsl 输出?

Eri*_*ric 2 powershell select-string

我想查看我是否正在运行特定的 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>
Run Code Online (Sandbox Code Playgroud)

无输出。我以前Get-Member看到输出是一个字符串;如果我通过类似的事情来运行它,| Out-String -stream那没有什么区别。

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

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

mkl*_*nt0 11

\n

令人费解的是,默认情况下wsl --list --running生成 UTF-16LE 编码(“Un​​icode”编码)输出,而不是遵循控制台的活动代码页,该代码页默认为旧系统区域设置的 OEM 代码页。

\n
\n

更新:正如Vimes 的回答中所述,v0.64 及更高版本wsl.exe(通过第一行输出验证wsl.exe --version)现在支持将WSL_UTF8环境变量设置为1以使wsl.exe输出为 UTF-8 编码的输出:

\n
$env:WSL_UTF8 = 1\nwsl --list --running | Select-String -Pattern MyDistro\n
Run Code Online (Sandbox Code Playgroud)\n

只要您的发行版名称仅包含ASCII范围字符(这似乎是可能的),这就有效,因为 UTF-8 是 ASCII 的超集,就像 OEM 代码页一样;如果不是,即在(不太可能)您的发行版包含非 ASCII 范围字符(例如重音字符,如\xc3\xa9)的情况下:

\n
    \n
  • 如果您碰巧将系统配置为在系统范围内使用 UTF-8 (在这种情况下,OEM 和 ANSI 代码页都是UTF-8 - 请参阅此答案),上述解决方案将按原样工作。

    \n
  • \n
  • 否则,请使用下面的正确解决方法,或者 -实际上- 使用 此答案$env:WSL_UTF8 = 1中的解决方案。

    \n
  • \n
\n
\n

使用$env:WSL_UTF8

\n

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

\n
(wsl --list --running) -replace "`0" | Select-String -Pattern MyDistro\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
$prev = [Console]::OutputEncoding; [Console]::OutputEncoding = [System.Text.Encoding]::Unicode\nwsl --list --running | Select-String -Pattern MyDistro\n[Console]::OutputEncoding = $prev\n
Run Code Online (Sandbox Code Playgroud)\n