То, что вы пытаетесь сделать, на самом деле не требует того, что вы просите, и не работает с предоставленным обходным путем, поэтому я разделил это на две части.
Сохранение последнего использованного каталога в переменную среды
Создайте командный файл со следующим:
@CD /D %*
@>nul setx _LAST_DIR "%CD%"
Установите ваш автозапуск на следующее:
CD /D %_LAST_DIR%&doskey cd=@ECHO off$T<FILENAME> $*$T@ECHO on
Где <FILENAME> - это полный путь к только что созданному пакетному файлу. Или создайте пакетный файл в каталоге, указанном в переменной PATH чтобы вы могли просто использовать имя файла.
Разбивка:
- Это несколько команд, разделенных символом
& , что позволяет выполнять команды в последовательности.
CD /D %_LAST_DIR% изменит каталог на содержимое переменной среды _LAST_DIR . Ключ /D используется для разрешения перехода в каталог на другом диске.
doskey cd=@ECHO off$T<FILENAME> $*$T@ECHO on создает макрос DOSKEY который выполняет несколько действий.
doskey cd= создаст макрос, который заменит команду CD по умолчанию
$T является эквивалентом DOSKEY & и используется для разделения нескольких команд. $* - это DOSKEY эквивалентный %* и содержит все аргументы, передаваемые макросу.
- Макрос отключит
ECHO для уменьшения помех, изменит каталог, установит переменную среды, а затем снова включит ECHO .
- Поскольку мы используем пакетный файл внутри макроса
DOSKEY , мы можем использовать переменную %CD% чтобы указать полный путь к каталогу и учесть ошибки.
Дальнейшее чтение:
AutoExit
Эта часть не делает то, что вы хотите, но другие, использующие похожие условия поиска, могут найти это полезным.
Насколько я могу найти, эта опция не существует и не упоминается в документации Microsoft. Вот потенциальная работа вокруг.
Предупреждение: не используйте этот код, если вы его не понимаете, так как вы можете получить бесконечный цикл запуска командных строк. Это должно быть тщательно проверено перед использованием в любой производственной среде.
Создайте пакетный файл со следующим кодом и установите его в качестве автозапуска:
@cls
@cmd /d
<exit commands here>
@exit
Разбивка:
- Символ
@ в начале каждой строки, как вы уже знаете, скрывает сами команды и отображает только любой вывод. Это для уменьшения беспорядка.
cls очистит заголовок, содержащий версию Windows и информацию об авторских правах. Если вы хотите очистить его от обеих консолей, вы можете заменить следующую команду на cmd /d /k .
@cmd /d запустит новую ( дочернюю ) командную строку внутри нее и оставит ее открытой для запуска любых выбранных вами команд. Ключ /D указывает командной строке не использовать автозапуск.
- Когда дочерняя командная строка завершается, она продолжает запускать этот командный файл.
<exit commands here> должны быть заменены любыми командами, которые вы хотите запустить. Это не сможет получить доступ к любым переменным среды или изменениям переменных, которые являются локальными для дочерней командной строки. Даже SETX будет применяться только к будущим командным приглашениям, но не будет возвращено в родительскую командную строку.
Примечание. Если командная строка прервана ненормально (нажав на красный крестик в окне или завершив задачу в диспетчере задач), она не будет запускать ваши команды выхода.
Дальнейшее чтение: