PowerShell创建的Junction含\??\的原因、含义及与mklink的差异
这个问题其实戳中了Windows底层路径命名空间和不同工具实现细节的差异,我来给你一步步拆解清楚:
差异产生的原因
两种工具创建 junction 时的路径存储格式和底层API逻辑不一样:
- CMD的
mklink /J命令在创建 junction 时,会把目标路径以Win32用户态熟悉的路径格式(比如c:\bar)直接存储。当你用dir命令查看时,它读取的就是这个原生Win32格式的路径,所以显示正常。 - PowerShell的
New-Item -ItemType Junction在内部实现上,会调用将路径转换为NT内核态对象管理器路径格式的API来存储 junction 目标。这种格式会带上\??\前缀,所以dir读取时就直接把这个内核层面的路径格式显示出来了。
??\的含义
\??\是Windows NT内核对象管理器命名空间里的一个特殊别名,它指向当前进程的DosDevices目录——这个目录的作用是把我们日常用的Win32驱动器号(比如C:)、设备名称映射到内核级的设备对象上。简单说,\??\c:\bar和普通的c:\bar是完全等价的,只是前者是内核视角的路径写法,后者是用户态的标准写法。
为什么功能没有影响
不管junction存储的是Win32格式路径还是内核格式路径,Windows的文件系统子系统在解析junction目标时,都会自动完成格式转换,正确定位到实际的目标目录。所以两种方式创建的junction在实际使用中没有功能差异,只是dir命令显示的路径格式不同而已。
内容的提问来源于stack exchange,提问作者Simon Pratt




