Windows路径中多个反斜杠的已记录行为

kev*_*com 2 windows command-line path batch-file

显然,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
Run Code Online (Sandbox Code Playgroud)

这甚至可以与在命令行上传递的参数一起使用:

notepad "C:\Users\username\Desktop\\\\myfile.txt"
Run Code Online (Sandbox Code Playgroud)

此行为记录在任何地方吗?我试了搜查,只发现这个 SO疑问,甚至提到的行为。

注意:我不是在问UNC路径(\\服务器名),\\?\前缀或\\“双引号转义符。

注意:在使用批处理文件时,我偶然发现了这种现象。批处理文件中的一行看起来像这样:

"%SOME_PATH%\myapp.exe"
Run Code Online (Sandbox Code Playgroud)

变量展开后,命令如下所示:

"C:\Program Files\Vendor\MyApp\\myapp.exe"
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,该批处理文件按预期执行,并且未因某种“找不到路径”错误而失败。

Har*_*ton 5

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

所以像

c:\documents\..\code.\\working\.\myprogram\\\runme.exe..
Run Code Online (Sandbox Code Playgroud)

将结束解释为

c:\code\working\myprogram\runme.exe
Run Code Online (Sandbox Code Playgroud)

其中一些已记录在案,有些则没有。(正如汉斯所指出的那样,记录这种变通办法是合法的。)

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