将 \\wsl$\ 路径转换为符合 URI 的 \\wsl.localhost\

将 \\wsl$\ 路径转换为符合 URI 的 \\wsl.localhost\

什么是 .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\homeWindows 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)"

这无疑让事情变得更加复杂。

相关内容