PowerShell中如何检测是否已安装WSL Ubuntu发行版
WSL Ubuntu安装状态检测方案
匹配失效根因
wsl.exe默认输出编码为UTF-16LE,内容包含不可见控制字符(字节顺序标记BOM、多余空字节),部分版本WSL输出的发行版名称前还会附带不可见空格前缀,导致^Ubuntu的行首正则匹配无法命中。
可行解决方案
方案1:使用-q参数输出干净发行版列表
wsl -l -q(--quiet参数)会跳过标题行、默认发行版标记,仅输出纯净的发行版名称,配合前后空白清理即可精准匹配:
# 检测Ubuntu是否存在 $ubuntuInstalled = (wsl -l -q | ForEach-Object { $_.Trim() }) -contains 'Ubuntu'
如果返回$true则说明已安装Ubuntu发行版。
方案2:清理输出编码后正则匹配
如果需要识别默认发行版标记,可先对wsl -l的输出做编码清理后再匹配:
# 编码清理+匹配带默认标记的Ubuntu行 $ubuntuLine = wsl -l | ForEach-Object { [Text.Encoding]::ASCII.GetString([Text.Encoding]::Unicode.GetBytes($_)) } | Where-Object { $_.Trim() -match '^Ubuntu.*\(Default\)$' }
如果$ubuntuLine不为空,说明Ubuntu已安装且为默认WSL发行版。
完整检测脚本示例
# 拉取所有WSL发行版并清理空白 $distroList = wsl -l -q | ForEach-Object { $_.Trim() } $isUbuntuInstalled = $distroList -contains 'Ubuntu' if ($isUbuntuInstalled) { Write-Host "WSL Ubuntu 已安装" # 检测是否为默认发行版 $defaultLine = wsl -l | Select-String '\(Default\)$' if ($defaultLine -and $defaultLine.ToString().Trim().StartsWith('Ubuntu')) { Write-Host "Ubuntu 是当前默认WSL发行版" } } else { Write-Host "未检测到WSL Ubuntu 安装" }
内容的提问来源于stack exchange,提问作者pico
相关产品推荐
相关产品推荐

