Windows cmd中CD/D切换的原因是什么?

Windows cmd中CD/D切换的原因是什么?,windows,command-line,cmd,command-prompt,cd,Windows,Command Line,Cmd,Command Prompt,Cd,首先,我想说我确实理解Windows命令提示符cd命令的/d开关的作用。我只是好奇为什么它是这样工作的,而不是其他的。众所周知,它的作用如下: 除了更改驱动器的当前目录外,还可以使用/D开关更改当前驱动器 但每次我输入(例如)cdf:,很明显我都想更换驱动器。这就是为什么我认为这个开关本身是多余的 那么,明确设置此开关的意义是什么为什么默认情况下它不是隐含的?简短回答:因为DOS的行为是这样的,cmd试图模仿DOS 最初,DOS对每个驱动器都有一个“当前控制器”,因此,如果您写入cd d:\fo

首先,我想说我确实理解Windows命令提示符
cd
命令的
/d
开关的作用。我只是好奇为什么它是这样工作的,而不是其他的。众所周知,它的作用如下:

除了更改驱动器的当前目录外,还可以使用/D开关更改当前驱动器

但每次我输入(例如)
cdf:
,很明显我都想更换驱动器。这就是为什么我认为这个开关本身是多余的


那么,明确设置此开关的意义是什么为什么默认情况下它不是隐含的?

简短回答:因为DOS的行为是这样的,
cmd
试图模仿DOS

最初,DOS对每个驱动器都有一个“当前控制器”,因此,如果您写入
cd d:\folder
,则会更改
d
驱动器的当前目录

您可以在此处阅读更多关于此的信息:

你必须记住,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

dira:基本上是因为“进化”。DOS提供的原始
cd
没有
/d
(可能是因为没有人看到需要第二个驱动器;))谢谢您的回答!不知道每个驱动器都有自己的“当前目录”。另外,我不知道
a:file
功能,特别感谢您的提示:)即使在今天使用命令行和多个驱动器号时仍然有用。尽管现在它们通常是驱动器映射,而不是软盘。:-)为了完整起见,请注意“每个驱动器的当前目录”功能在Win32级别仍然存在,尽管实现有点粗糙,并且没有很好的文档记录。Raymond认为它只在
cmd.exe
中实现是错误的,这是他罕见的错误之一。@HarryJohnston您能进一步解释一下吗?我只能在WinAPI中找到GetCurrentDirectory和SetCurrentDirectory(设置当前驱动器和当前目录)@HarryJohnston我实际调试了
cmd.exe
,发现当您编写
cd d:\folder
(您当前的驱动器是
c:
)时,它不会调用
SetCurrentDirectoryW
,但是当您编写
d:
-它调用
SetCurrentDirectoryW
,并将
d:\folder
作为参数。您确定此功能在WinAPI中而不是在
cmd.exe中吗?请仔细想想。每个驱动器的当前目录信息存储在环境变量中。(使用
set
命令会对您隐藏这些变量,但您可以在从命令行启动的应用程序的环境块中看到它们。)如果我没记错的话,只有
cmd.exe
设置这些变量,但是(大多数?)如果您向它们传递驱动器相对路径,Win32 API函数会尊重它们。在命令行应用程序中尝试类似于
CreateFile(“d:test.txt”)
的方法,看看我的意思。
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")