如何在powershell中匹配wsl输出?[副本]

qgelzfjb  于 2023-10-18  发布在  Shell
关注(0)|答案(2)|浏览(128)

此问题已在此处有答案

Powershell - Strange WSL output string encoding(5个答案)
关闭7天前。
我想看看我是否正在运行特定的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中有更好的方法吗?

daupos2t

daupos2t1#

令人费解的是,wsl --list --running默认生成UTF-16 LE编码(“Unicode”编码)输出,而不是遵循控制台的活动代码页,默认为旧系统区域设置的OEM代码页。
更新:如Vimes' answer中所述,wsl.exe v0.64及以上版本(通过wsl.exe --version输出的第一行验证)现在支持将**WSL_UTF8环境变量设置为1**,使wsl.exe输出UTF-8编码的输出:

$env:WSL_UTF8 = 1
wsl --list --running | Select-String -Pattern MyDistro

只要您的发行版名称仅包含ASCII范围的字符(这似乎是可能的),这就可以工作,因为UTF-8是ASCII的超集,就像OEM代码页一样。
如果您碰巧将系统配置为使用UTF-8 system-wide(在这种情况下,OEM和ANSI代码页 * 都是 * UTF-8 -参见this answer),则上述解决方案甚至可以处理非ASCII范围的字符。
否则,如果(不太可能)您的发行版包含非ASCII范围的字符(例如,重音字符,如é),请使用下面的第二个解决方法。

  • 不使用$env:WSL_UTF8**:

一个快速和肮脏的解决方法-假设所有运行的发行版都只使用 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
zqdjd7g9

zqdjd7g92#

我刚刚发现$env:WSL_UTF8=1使wsl.exe输出UTF8。选择字符串和更多似乎现在工作!
(Prevoius回答:如果你不需要正则表达式,那么Select-String -simplematch似乎可以工作。

相关问题