You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:PowerShell中对WSL分发列表正则匹配多字符失败

解决WSL输出正则多字符匹配失败的问题

问题根源

wsl命令的输出采用UTF-16LE编码,每个可见字符后都附带一个空字节(\0)。这导致看似正常的字符串实际结构是字符\0字符\0...:

  • 单字符匹配(比如'e')能成功,是因为正则会匹配到e\0中的e
  • 多字符匹配(比如'ef')失败,是因为实际字符串中e和f之间隔着空字节,无法形成连续的ef序列

解决步骤

1. 清理输出中的空字节

在获取wsl输出时,先过滤掉所有空字符:

# 清理空字节并过滤空行
$test = wsl --list | ForEach-Object { $_ -replace "`0", "" } | Where-Object { $_ -and $_ -ne '' }

2. 验证匹配效果

处理后的字符串可以正常使用正则或通配符匹配:

  • 使用Select-String多字符匹配:
$test | Select-String -Pattern 'ef'
# 输出:docker-desktop-data (Default)
  • 使用-like通配符匹配:
$test | ForEach-Object { if ($_ -like '*ef*') { Write-Output $_ } }
# 输出:docker-desktop-data (Default)

直接提取默认WSL分发版

如果你的目标是获取默认分发版名称,可以一步到位,无需先存所有输出:

$defaultDistro = wsl --list --verbose | 
    Select-String '\(Default\)' | 
    ForEach-Object {
        $cleanLine = $_.Line -replace "`0", ""
        ($cleanLine -split '\s+\(Default\)')[0].Trim()
    }

# 输出默认分发版名称
$defaultDistro

内容的提问来源于stack exchange,提问作者James Dudley

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:13:38