Открыть список
Как стать автором
Обновить

Избавляемся от «исторических причин» в cmd.exe более лёгким и стандартным способом

Оболочки
Из песочницы
Всем привет! Сегодня я хочу поделится с вами более лёгким и правильным, с моей точки зрения, способом достижения аналогичного описанному в статье пользователя NikitaTrophimov результата.
Думаю, нет смысла повторно писать вводную часть — автор оригинальной статьи это сделал до меня — и, так как моя статья вряд ли увидела бы свет, не напиши он свою, и является всего лишь альтернативным видением способа решения задачи, то я сосредоточусь на главном.

Как и автору оригинальной статьи, мне представлялось весьма странным поведение команды «cd» (или «chdir») в cmd.exe. Казалось нелогичным, что для смены активного диска необходимо каждый раз выполнять дополнительные действия. Являясь поклонником интерфейса командной строки, я не раз пробовал улучшать внешний вид и возможности стандартного командного интерпретатора Microsoft Windows, но о возможности изменить стандартное поведение команды «cd» раньше даже не задумывался. После прочтения вышеупомянутой статьи на Хабре мне не давало покоя ощущение чрезмерной нестандартности и сложности описанного способа… а желание создать свой собственный велосипед и поскорее уже начать им пользоваться привело к кучке паре-тройке часов потраченного в ближайший выходной времени на разбор полётов. Итак, кому интересны мои изыскания — добро пожаловать под кат!

Небольшой ликбез по теме (можно не читать)
Стандартным механизмом для изменения поведения команд/программ «по умолчанию» (что справедливо для всех известных мне операционных систем) являются аргументы запуска, параметры, указываемые через пробел после имени команды или исполняемого файла. Именно этот механизм позволяет изменить поведение команды для смены текущей директории в cmd.exe на нужное нам. Указанный при вызове команды «cd» (или «chdir») параметр "/d" позволяет одновременно со сменой текущего каталога изменять и активный диск.

Ещё одним стандартным механизмом, использующимся для настройки параметров окружения «под себя» является механизм alias -ов. Хорошо известный и часто применяемый в среде Unix подобных операционных систем, он часто оказывается обделённым вниманием и даже вообще незаслуженно позабытым в Microsoft Windows. Этот механизм позволяет назначить свои собственные имена вызова для команд, программ, пар команда/программа+параметры и, что самое главное, позволяет изменить поведение стандартных команд и программ, т.к. алиасы имеют больший приоритет по сравнению с командами оболочек и программами, найденными оболочкой в директориях, указанных в переменной окружения «PATH».

Именно этим мы и воспользуемся. Приступим!

Постановка задачи: Команда «cd» должна автоматически изменять активный диск, если в качестве аргумента передан путь к данным на отличном от текущего диске.

Решение: Казалось бы чего проще? Используя «doskey» создаём алиас «cd=cd /d $*» и радуемся жизни… но вот в чём загвоздка — ломается стандартное поведение команды «cd» при запуске без параметров. Запущенная без параметров, эта команда является полным аналогом команды «pwd» из оболочек Unix подобных операционных систем и должна бы выдавать на консоль информацию о текущей директории, но после задания алиаса она уже будет выполнятся с ключом "/d", наличие которого подразумевает и наличие следующего параметра — пути, по которому следует перейти. Не обнаружив его — команда выдаст на консоль сообщение об ошибке и завершит работу. Такое решение нас явно не устраивает!

После некоторого количества размышлений, вдумчивого просмотра страничек Хабра и активного Гугления родилось следующее решение — а почему бы не написать .bat файл? Постойте, не спешите закидывать меня помидорами, я и сам не любитель костылей. Решение было вполне продуманным и, как вы сейчас увидите, имеющим шанс оказаться рабочим.

Моя идея состояла в следующем — я решил написать .bat файл, принимающий аргументы и запускающий стандартную команду «cd» с переданными ему аргументами. В случае, если аргументов запуска у файла нет — он запускает команду «cd» без аргументов (режим вывода текущей директории), если аргументы есть — добавляет перед ними ключ "/d" и выполняет команду «cd» с ключом "/d" и переданными ему аргументами. Т.е. при использовании этого решения мы получаем желаемое — работает стандартное поведение команды «cd» без аргументов и работает автоматическая смена диска.

@echo off

if "%*" == "" (
    cd
) else (
    cd /d "%*"
)

exit /b


Итак, мы уже получили рабочее решение, но это ещё не то, что нам нужно. Осталось заменить стандартную команду смены директории, и в этом нам поможет механизм alias -ов. Сохраняем полученный .bat файл в одну из директорий, описанных в переменной «PATH» (к примеру в %WINDIR%\System32), с именем cd.bat и создаём алиас командой «doskey cd=cd.bat $*». Всё бы хорошо, но алиас сохранится только до закрытия текущего окна cmd.exe… надо исправить ситуацию! Создаём ещё один .bat файл для автоматической установки переменных окружения при запуске окон cmd.exe — cmd_env.bat, который так же сохраняем в выбранную директорию рядом с cd.bat

@echo off

doskey /macrofile="%USERPROFILE%\aliases"

exit /b


Также необходимо создать простой текстовый файл «aliases» и разместить его в %USERPROFILE%

cd="%WINDIR%\System32\cd.bat" $*



и .reg файл для активации автоматического запуска cmd_env.bat при открытии cmd.exe

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Command Processor]
"Autorun"="C:\\Windows\\System32\\cmd_env.bat"



Сохраняем его, к примеру, с именем cmd_env_reg.reg

Импортируем параметры из файла cmd_env_reg.reg в реестр и запускаем cmd.exe любым доступным способом. Готово! Проверяем результат!

Данное решение было успешно протестировано на работоспособность в среде Windows 2008 R2, 7, 2003 R2, XP.

PS: Большое спасибо автору оригинальной статьи за то, что подтолкнул меня к действию. Без его статьи я ещё долго терпел бы неудобства и мечтал о том, что «будет время — займусь».

PPS: Файл cmd_env.bat можно и нужно использовать для настройки cmd.exe — к примеру, для задания стандартных цветов в консоли командой «color 02» или для установки переменных окружения.

PPPS: Ссылки для интересующихся темой — ConEmu, Clink, cmder и прочие — Console2 и её форк ConsoleZ, rCons, WinQConsole
Теги:clicmd linecommand linecommand line uicmd.exewindowsулучшениеcddoskeyaliasaliases
Хабы: Оболочки
Всего голосов 22: ↑19 и ↓3 +16
Просмотры18.2K

Похожие публикации

Software Developer in Test (C++)
до 230 000 ₽ItivitiСанкт-Петербург
Senior Web Designer
от 100 000 ₽Direct Line DevelopmentМожно удаленно
UX/UI дизайнер
до 300 000 ₽SimpleFinance GroupМосква
Разработчик Frontend (UI)
от 150 000 до 200 000 ₽ВГТМосква
Infrastructure Lead
до 3 500 €EXANTEМоскваМожно удаленно

Лучшие публикации за сутки