Windows含..的路径解析疑问:PowerShell与CMD的解析逻辑
Windows下PowerShell与CMD的路径解析逻辑疑问
我负责的项目中有一段Windows平台的Perl代码,路径设置为dirname(__FILE__) . "../../../../",这段代码已正常运行数年。但后来我发现,实际上只需要3个..(即dirname(__FILE__) . "/../../../")就能得到目标路径,不过当前多一个..的写法仍能解析到正确位置。
Perl拼接后的路径为..\dir1\dir2../../../../,其中dir2..看起来不符合路径规范,我用PowerShell测试后得到如下结果:
> Test-Path ..\dir1\dir2.. True > Test-Path ..\dir1\dir2..\ False > Test-Path ..\dir1\dir2..\..\ True
想请教:PowerShell是如何解析这类路径的?且CMD也存在相同行为。
核心解析逻辑:Windows文件系统的路径处理规则
Windows平台的文件系统(PowerShell、CMD均基于此)解析路径时,遵循以下关键规则:
- 逐段处理路径组件:将路径按分隔符(
\或/,连续多个会被视为单个)拆分为组件,逐个解析。 - 文件名允许包含
..:Windows文件名/目录名可以包含..(只要不含\、/、:等非法字符),所以无末尾分隔符的..\dir1\dir2..会被直接当作dir1目录下存在名为dir2..的目录,若实际存在则Test-Path返回True。 - 末尾分隔符触发目录跳转解析:当路径以
\结尾时,系统会将最后一个组件中的..视为父目录跳转指令。比如..\dir1\dir2..\会被解析为..\dir1\dir2\..,即跳转到dir1目录;若dir1存在但不存在名为dir2..的目录,Test-Path就会返回False。 - 多段
..的组合解析:对于..\dir1\dir2..\..\,系统会先处理dir2..\..——先识别dir2..为目录,再跳转到其父目录,最终等价于..\dir1\..(即当前目录的上上级目录),若该目录存在则返回True。
你的Perl代码为何能正常运行?
拼接出的..\dir1\dir2../../../../中,dir2../(后续的/作为分隔符)会被解析为dir2\..,即跳转到dir1目录,之后再处理后续的../../,最终等价于向上跳转4级。由于你的目录结构可能存在冗余层级,导致实际跳转结果和预期的3级跳转指向了同一目标路径,所以代码能正常运行。
内容的提问来源于stack exchange,提问作者Warpstar22
相关产品推荐
相关产品推荐

