在Windows路径中使用多个反斜杠的规范行为说明

5

显然,Windows(或者至少是Windows的某些部分)忽略路径中的多个反斜杠,并将它们视为单个反斜杠。例如,从命令提示符或运行窗口执行以下任何命令都会打开记事本:

C:\Windows\System32\Notepad.exe
C:\Windows\System32\\Notepad.exe
C:\Windows\System32\\\Notepad.exe
C:\Windows\System32\\\\Notepad.exe
C:\\Windows\\System32\\Notepad.exe
C:\\\Windows\\\System32\\\Notepad.exe

这甚至可以使用在命令行传递的参数中:
notepad "C:\Users\username\Desktop\\\\myfile.txt"

这种行为在哪里有记录?我进行了几次搜索,只发现这个SO问题甚至提到了这种行为。
注意:我不是在询问UNC路径(\\servername)、\\?前缀或\\"双引号转义。
注意:我在处理批处理文件时偶然发现了这种行为。批处理文件中的一行看起来像这样:
"%SOME_PATH%\myapp.exe"

变量展开后,命令看起来是这样的:

"C:\Program Files\Vendor\MyApp\\myapp.exe"

令我惊讶的是,批处理文件已按预期执行,没有出现任何“路径未找到”错误。

5
像大多数软件供应商一样,微软从不记录他们的“虽然有错但我还是会接受”的解决方法。记录下来会让错误做法合法化。 - Hans Passant
2个回答

8

在大多数情况下,Win32 API函数将接受路径名格式的广泛变化,包括将相对路径转换为基于当前目录或每个驱动器当前目录的绝对路径,将单个点解释为“此目录”,两个点解释为“父目录”,将正斜杠转换为反斜杠,并删除多余的反斜杠和尾随句点。

因此,像这样的内容:

c:\documents\..\code.\\working\.\myprogram\\\runme.exe..

将会被解释为
c:\code\working\myprogram\runme.exe

其中有一些是有文档记录的,但也有一些没有。 (正如Hans所指出的,记录这种解决方法会使错误变得合法。)

请注意,这仅适用于Win32 API,不一定适用于每个应用程序,甚至不一定适用于每个系统组件。特别是命令解释器在处理长路径时具有更严格的规则,而资源管理器将不接受点或双点,并且通常不接受正斜杠。此外,如果服务器未运行Windows,则网络驱动器的规则可能会有所不同。


@Leon,感谢你的修改。事实上,整个段落都是错误的,我被命令解释器的行为误导了。 - Harry Johnston

-1

没有任何影响,因为您甚至无法使用反斜杠命名文件或文件夹。因此,在路径中,多个连续的反斜杠将始终被视为一个分隔符。


这不是正确的。你可以使用 dir c:\,但你不能使用 dir c:\\ - MC ND
dir C:\\ 不起作用,但是 dir C:\Windows\\ 可以正常工作。dir 命令必须使用稍微不同的逻辑。 - kevinbatchcom
1
是的,许多内置命令会自行解析路径名,因此与Win32 API有稍微不同的规则。这可能是为了向后兼容DOS。如果您输入“dir c:\Users\xyzzy”,则会显示“未找到网络路径”,因此似乎双反斜杠靠得太近会使cmd.exe混淆为UNC路径。另一方面,notepad.exe对相同的语法非常满意。 - Harry Johnston
@MCND 但实际上,以下代码也可以工作:for %a in ("C:\\") do dir %~dpna 还有 mkdir c:\\folder。只有 DIR 命令会混淆。这是证明规则的反例。 - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接