Windows cmd中CD/D开关的原因是什么?

20

首先我想指出,我确实了解Windows命令提示符cd命令中/D开关的用途。我只是好奇它为什么会这样工作而不是其他方式。正如我们所知道的那样:

使用/D开关可以在更改驱动器当前目录的同时更改当前驱动器。

但每次我输入(例如)cd F: ,很明显我想要改变驱动器。这就是为什么我认为这个开关本身是多余的原因。

那么明确设置此开关有什么意义?为什么不默认暗示它呢?


1
基本上是因为“演变”。DOS的原始cd命令没有/d选项(可能是因为没有人看到需要第二个驱动器;))。请参见此答案 - Stephan
2个回答

14
简短回答:因为DOS会这样行事,而cmd试图模仿DOS。 起初,DOS对于每个驱动器都有一个“当前目录”,所以如果你写cd d:\folder,你就会改变D驱动器的当前目录。 你可以在这里阅读更多相关信息: https://devblogs.microsoft.com/oldnewthing/20101011-00/?p=12563

1
请注意,"每个驱动器的当前目录"功能在Win32级别仍然存在,尽管实现方式有点不正规且文档记录不太完整。 Raymond关于它只在cmd.exe中实现的说法是错误的,这是他罕见的错误之一。 - Harry Johnston
@HarryJohnston 能否请您进一步阐述?我只能在WinAPI中找到GetCurrentDirectory和SetCurrentDirectory(同时设置当前驱动器和当前目录)- https://msdn.microsoft.com/en-us/library/windows/desktop/aa364934(v=vs.85).aspx https://msdn.microsoft.com/en-us/library/windows/desktop/aa365530(v=vs.85).aspx - Mark Segal
@HarryJohnston 我实际上调试了 cmd.exe 并发现当你输入 cd d:\folder(而你当前的驱动器是 c:)时,它不会调用 SetCurrentDirectoryW,但是当你输入 d: 时,它会使用 d:\folder 作为参数调用 SetCurrentDirectoryW。你确定这个功能是在 WinAPI 中而不是在 cmd.exe 中吗? - Mark Segal
一半一半,想想看。每个驱动器的当前目录信息存储在环境变量中。(set命令将它们隐藏起来,但是您可以在从命令行启动的应用程序的环境块中看到它们。)如果我没记错的话,只有cmd.exe 设置这些变量,但是(大多数?)Win32 API函数尊重它们,如果您传递给它们一个相对于驱动器的路径。尝试在命令行应用程序中使用类似CreateFile("d:test.txt")的东西,就会明白我的意思了。 - Harry Johnston

8
请记住,DOS的历史可以追溯到我们甚至没有鼠标来剪切和粘贴文本以及屏幕只有80x25个字符的时代。在那个时候,额外的输入,特别是如果你需要记住某些内容并稍后输入,将会非常痛苦。现在想象一下尝试在多个驱动器上工作。由于只有一个当前目录,您必须完全指定与当前驱动器不同的驱动器上的目录。这将需要在其他驱动器上写下路径,因为它们不会停留在屏幕上。哎呀。所以,您可以采取以下措施:
dir a:           <- See what dir I need
cd a:foo         <- This one
dir a:           <- See what file
dir b:           <- See what dir I need
cd b:bar         <- This one
dir b:           <- See what file
a:program b:data <- use them both

否则,它将是:
dir a:                <- See what dir I need
cd a:foo              <- This one
dir a:                <- See what file (lots of scroll)
dir b:\               <- See what dir I need (scroll)
cd b:\bar             <- This one
dir b:                <- See what file (lots of scroll)
a:\foo\program b:data <- use them both (had to remember "foo")

现在想象一下,它不止一个目录深。

再想象一下,如果程序不支持子目录,并且您需要在两个不同的驱动器上传递两个路径给它。


谢谢你的回答!我不知道每个驱动器都有自己的“当前目录”。而且,我也不知道关于a:file功能,特别感谢这个提示 :) - kefir500
即使在今天,当您使用命令行和多个驱动器号时,它仍然非常有用。尽管现在它们通常是驱动器映射而不是软盘驱动器。 :-) - Harry Johnston

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