То, что вы пытаетесь сделать, на самом деле не требует того, что вы просите, и не работает с предоставленным обходным путем, поэтому я разделил это на две части.
Сохранение последнего использованного каталога в переменную среды
Создайте командный файл со следующим:
@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
будет применяться только к будущим командным приглашениям, но не будет возвращено в родительскую командную строку.
Примечание. Если командная строка прервана ненормально (нажав на красный крестик в окне или завершив задачу в диспетчере задач), она не будет запускать ваши команды выхода.
Дальнейшее чтение: