【问题标题】:What is the reason for the CD /D switch in Windows cmd?Windows cmd中CD / D开关的原因是什么?
【发布时间】:2015-09-25 12:00:46
【问题描述】:

首先我想说的是,我确实了解 Windows 命令提示符 cd 命令的/D 开关的用途。我只是好奇为什么它以这种方式工作,而不是其他方式。众所周知,它执行以下操作:

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

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

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

【问题讨论】:

  • 基本上是因为“进化”。来自 DOS 的原始 cd 没有 /d(可能是因为没有人看到需要第二个驱动器;))参见 this answer

标签: windows command-line cmd command-prompt cd


【解决方案1】:

简答:因为 DOS 的行为方式是这样的,cmd 试图模仿 DOS。

最初,DOS 对每个驱动器都有一个“当前目录”,因此如果您编写 cd d:\folder,您将更改 D 驱动器的当前目录。

您可以在此处阅读更多相关信息: http://blogs.msdn.com/b/oldnewthing/archive/2010/10/11/10073890.aspx

【讨论】:

  • 为了完整起见,请注意“每个驱动器的当前目录”功能仍然存在于 Win32 级别,尽管该实现有点 hacky 并且没有很好的文档记录。 Raymond 认为它仅在 cmd.exe 中实现是错误的,这是他罕见的错误之一。
  • @HarryJohnston 你能详细说明一下吗?我只能在 WinAPI 中找到 GetCurrentDirectory 和 SetCurrentDirectory(设置当前驱动器和当前目录) - msdn.microsoft.com/en-us/library/windows/desktop/… msdn.microsoft.com/en-us/library/windows/desktop/…
  • @HarryJohnston 我实际上调试了cmd.exe,发现当你写cd d:\folder(并且你当前的驱动器是c:) - 它不会调用SetCurrentDirectoryW,但是当你写@ 987654332@ - 它以d:\folder 作为参数调用SetCurrentDirectoryW。您确定此功能在 WinAPI 中而不是在 cmd.exe 中吗?
  • 一半一半,想想吧。每个驱动器的当前目录信息存储在环境变量中。 (set 命令对您隐藏它们,但您可以在从命令行启动的应用程序的环境块中看到它们。)如果我没记错的话,只有cmd.exe 设置这些变量,但是(大多数?)Win32 API 函数尊重它们,如果你将它们传递给驱动器相对路径。在命令行应用程序中尝试CreateFile("d:test.txt") 之类的东西,看看我的意思。
【解决方案2】:

您必须记住,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 功能,特别感谢这个提示:)
  • 即使在今天仍然有用,当您使用命令行和多个驱动器号时。尽管现在它们通常是驱动器映射而不是软盘。 :-)
猜你喜欢
  • 2013-08-21
  • 2021-08-10
  • 2020-01-14
  • 2017-04-10
  • 2018-03-28
  • 2016-08-28
  • 2016-09-01
  • 2011-12-04
  • 2011-08-29
相关资源
最近更新 更多