【问题标题】:Documented behavior for multiple backslashes in Windows pathsWindows 路径中多个反斜杠的记录行为
【发布时间】:2016-01-06 17:43:50
【问题描述】:

显然,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"

这种行为是否记录在任何地方?我尝试了几次搜索,只发现this SO 问题甚至提到了这种行为。

注意:我不是在询问 UNC 路径 (\\servername)、\\?\ 前缀或 \\" 双引号转义。

注意:我在处理批处理文件时偶然发现了这种行为。批处理文件中的一行如下所示:

"%SOME_PATH%\myapp.exe"

变量展开后,命令如下:

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

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

【问题讨论】:

  • 微软和大多数软件供应商一样,从不记录他们的“这是错误的,但无论如何我都会接受”的解决方法。记录它使做错的事情合法化。

标签: windows batch-file command-line path


【解决方案1】:

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

类似

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

最终会被解释为

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

Some of this is documented,有些不是。 (正如 Hans 指出的那样,记录这种变通方法使做错事合法化。)

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

【讨论】:

  • @Leon,感谢您的编辑。事实上,整个段落都不正确,我被命令解释器的行为误导了。
【解决方案2】:

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

【讨论】:

  • 这是不正确的。你可以dir c:\ ,但你不能dir c:\\
  • dir C:\\ 不起作用,但 dir C:\Windows\\ 确实起作用。 dir 命令必须使用稍微不同的逻辑。
  • 是的,许多内置命令自己解析路径名,因此与 Win32 API 的规则略有不同。大概这是为了向后兼容 DOS。如果你说dir c:\\Users\xyzzy,你会得到“找不到网络路径”,所以看起来双反斜杠离开头太近了,让cmd.exe 误以为这是一条UNC 路径。另一方面,notepad.exe 对相同的语法非常满意。
  • @MCND 但事实上,下面的代码在for %a in ("C:\\") do dir %~dpna 也可以在mkdir c:\\folder 上工作。 cd "c:\\" 只有 DIR 命令被混淆了。这是证明规则的反例
猜你喜欢
  • 1970-01-01
  • 2014-02-04
  • 2020-11-25
  • 1970-01-01
  • 2015-03-24
  • 2013-01-22
  • 2014-04-29
  • 2015-07-22
相关资源
最近更新 更多