В чем причина переключения CD / D в Windows cmd?

Сначала я хотел бы сказать, что я понимаю назначение переключателя /D для команды командной строки Windows cd. Мне просто любопытно, почему это работает именно так, а не иначе. Как мы все знаем, он делает следующее:

Используйте переключатель / D, чтобы изменить текущий диск в дополнение к изменению текущего каталога для диска.

Но каждый раз, когда я ввожу (например) cd F:, достаточно очевидно, что я хотел бы сменить диск. Вот почему я считаю, что этот переключатель сам по себе лишний.

Так какой смысл явно устанавливать этот переключатель? Почему это не подразумевается по умолчанию?


person kefir500    schedule 25.09.2015    source источник
comment
в основном из-за эволюции. В оригинальном cd из DOS не было /d (вероятно, потому что никто никогда не видел необходимости во втором диске;)) См. этот ответ   -  person Stephan    schedule 25.09.2015


Ответы (2)


Краткий ответ: потому что DOS вела себя таким образом, и cmd пытается имитировать DOS.

Первоначально в DOS был «текущий директор» для каждого диска, поэтому, если вы пишете cd d:\folder, вы меняете текущий каталог для D диска.

Подробнее об этом можно прочитать здесь: http://blogs.msdn.com/b/oldnewthing/archive/2010/10/11/10073890.aspx.

person Mark Segal    schedule 25.09.2015
comment
Для полноты заметьте, что функциональность текущего каталога для каждого диска все еще существует на уровне Win32, хотя реализация является хакерской и не очень хорошо документирована. Раймонд ошибается, говоря, что это реализовано только в cmd.exe, что является одной из его редких ошибок. - person Harry Johnston; 26.09.2015
comment
@HarryJohnston Не могли бы вы рассказать подробнее? Я смог найти только GetCurrentDirectory и SetCurrentDirectory в WinAPI (установив как текущий диск, так и текущий каталог) - msdn.microsoft.com/en-us/library/windows/desktop/ msdn.microsoft.com/en-us/library/windows/desktop/ - person Mark Segal; 26.09.2015
comment
@HarryJohnston Я на самом деле отлаживал cmd.exe и обнаружил, что когда вы пишете cd d:\folder (а ваш текущий диск - c:) - он не вызывает SetCurrentDirectoryW, но когда вы пишете d: - он вызывает SetCurrentDirectoryW с d:\folder в качестве параметра. Вы уверены, что эта функция есть в WinAPI, а не в cmd.exe? - person Mark Segal; 26.09.2015
comment
Половина и половина, если подумать. Информация о текущем каталоге для каждого диска хранится в переменных среды. (Команда set скрывает их от вас, но вы можете увидеть их в блоке среды приложения, запущенного из командной строки.) Если я правильно помню, только cmd.exe устанавливает эти переменные, но (большинство? ) Функции Win32 API уважают их, если вы передаете им путь, относящийся к диску. Попробуйте что-нибудь вроде CreateFile("d:test.txt") в приложении командной строки, чтобы понять, что я имею в виду. - person Harry Johnston; 27.09.2015

Вы должны помнить, что 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")

Теперь представьте, что это больше, чем одна директория.

А теперь представьте, что программа не поддерживает подкаталоги и вам нужно передать к ней два пути на двух разных дисках.

person David Schwartz    schedule 25.09.2015
comment
Спасибо за ваш ответ! Не знал, что у каждого диска есть свой текущий каталог. Также я не знал о функционале a:file, отдельное спасибо за подсказку :) - person kefir500; 25.09.2015
comment
По-прежнему полезно даже сегодня, когда вы используете командную строку и несколько букв дисков. Хотя в настоящее время это обычно сопоставления дисков, а не гибких дисков. :-) - person Harry Johnston; 26.09.2015