Всем привет! Сегодня я хочу поделится с вами более лёгким и правильным, с моей точки зрения, способом достижения аналогичного описанному в статье пользователя NikitaTrophimov результата.
Думаю нет смысла повторно писать вводную часть — автор оригинальной статьи это сделал до меня — и так как моя статья вряд ли увидела бы свет не напиши он свою и является всего лишь альтернативным видением способа решения задачи, то я сосредоточусь на главном.
Как и автору оригинальной статьи, мне представлялось весьма странным поведение команды «cd» (или «chdir») в cmd.exe. Казалось нелогичным, что для смены активного диска необходимо каждый раз выполнять дополнительные действия. Являясь поклонником интерфейса командной строки я не раз пробовал улучшать внешний вид и возможности стандартного командного интерпретатора Microsoft Windows, но о возможности изменить стандартное поведение команды «cd» раньше даже не задумывался. После прочтения вышеупомянутой статьи на Хабре мне не давало покоя ощущение чрезмерной нестандартности и сложности описанного способа… а желание создать свой собственный велосипед и поскорее уже начать им пользоваться привело к кучке паре-тройке часов потраченного в ближайший выходной времени на разбор полётов. Итак, кому интересны мои изыскания — добро пожаловать под кат!
Ещё одним стандартным механизмом, использующимся для настройки параметров окружения «под себя» является механизм 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=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
ссылка на оригинал статьи http://habrahabr.ru/post/263105/
Добавить комментарий