什么是 .NET 或 Windows API 来执行转换\\wsl$\
为URI
兼容的\\wsl.localhost\
?
Windows 资源管理器将包括 在内的路径转换\\wsl$\
为\\wsl.localhost\
,我认为这与 wsl2 有关。我想使用受支持的 API 来避免对从wsl$
到 的转换进行硬编码wsl.localhost
,并可能遗漏任何边缘情况。
答案1
据我所知,没有 .NET 或 Windows API 可以为您提供此功能,因为它不是视窗设置网络共享——当然是 WSL 本身。
在 Windows 10 上,正如 @Ramhound 在评论中提到的,WSL\\wsl$\<distroname>
为每个正在运行的发行版设置了一个名为的网络共享。
在 Windows 11 上,它实际上注册两个都 \\wsl$\<distroname>
和 \\wsl.localhost\<distroname>
. 它实际上这样做是为了全部已安装的 WSL2 发行版,而不仅仅是正在运行的发行版。但是,“默认”现在是共享\\wsl.localhost\<distroname>
。
不过,我确实想出了一个稍微有点棘手的解决办法。
由于 WSL 确实知道此共享(以及默认共享),我们可以wslpath
通过 WSL 使用命令来获取正确的路径。往返\\wsl$\
路径wslpath
将返回 Windows 10 或 11 的正确“默认”路径。
例如,从 WSL(Bash)内部:
p='\\wsl$\Ubuntu\home'
wslpath -w $(wslpath -u $p)
\\wsl.localhost\Ubuntu\home
Windows 11 上的回归- Windows 10 上的返回值
\\wsl$\Ubuntu\home
(无变化)
从 PowerShell,您可以通过wsl.exe
命令本身调用它,尽管引用/转义开始变得更加复杂:
$p = '\\\\wsl$\\Ubuntu\\home'
wsl ~ -e bash -c "wslpath -w `$(wslpath -u $p)"
其返回的结果与上面相同。
有一个巨大的不过,这里有一个警告——如果你只有一个分布,这种方法是可行的。如果你有多个分布,那么任何给定分布中的路径只有那特定分布。
换句话说,如果您有名为“Ubuntu”和“Debian”的发行版,那么上述操作仅在 Ubuntu 是您的默认发行版时才有效。如果您尝试规范化 Debian 发行版中的路径(例如\\wsl$\Debian\home
),那么您需要通过 Debian 发行版进行此操作。例如(从 PowerShell):
$p = '\\\\wsl$\\Debian\\home'
wsl ~ -d Debian -e bash -c "wslpath -w `$(wslpath -u $p)"
这无疑让事情变得更加复杂。