此问题已在此处有答案:
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中有更好的方法吗?
2条答案
按热度按时间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编码的输出:只要您的发行版名称仅包含ASCII范围的字符(这似乎是可能的),这就可以工作,因为UTF-8是ASCII的超集,就像OEM代码页一样。
如果您碰巧将系统配置为使用UTF-8 system-wide(在这种情况下,OEM和ANSI代码页 * 都是 * UTF-8 -参见this answer),则上述解决方案甚至可以处理非ASCII范围的字符。
否则,如果(不太可能)您的发行版包含非ASCII范围的字符(例如,重音字符,如
é
),请使用下面的第二个解决方法。$env:WSL_UTF8
**:一个快速和肮脏的解决方法-假设所有运行的发行版都只使用 ASCII-range 字符描述(这似乎是可能的)-是使用以下内容:
一个支持所有Unicode字符的适当的解决方法需要更多的努力:
zqdjd7g92#
我刚刚发现
$env:WSL_UTF8=1
使wsl.exe输出UTF8。选择字符串和更多似乎现在工作!(Prevoius回答:如果你不需要正则表达式,那么
Select-String -simplematch
似乎可以工作。