2

В Windows при создании значения autorun в разделе реестра HKEY_CURRENT_USER\Software\Microsoft\Command Processor и установке, скажем, echo Hello from autorun , вызов cmd.exe при вызове сначала выполнит эту строку.

Существует ли эквивалентное значение, аналогичное autoexit для запуска при закрытии cmd.exe?

Я попытался autoexit, autoclose, autoquit, exit, onexit, onquit и quit не повезло.

Чего я хочу добиться, так это сохранить текущий каталог при выходе из cmd.exe , установив (воображаемое) autoexit реестра setx _LAST_DIR "%cd%" , чтобы я мог вызвать его при следующем вызове с помощью cd "%_LAST_DIR%" или в файле Command prompt Last Dir.lnk с полем Start in поле ввода, %_LAST_DIR% .

Мое текущее решение состоит в том, чтобы иметь пакетный файл в PATH , myexit.cmd:

@setx _LAST_DIR "%CD%"
@exit

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

1 ответ1

0

То, что вы пытаетесь сделать, на самом деле не требует того, что вы просите, и не работает с предоставленным обходным путем, поэтому я разделил это на две части.

Сохранение последнего использованного каталога в переменную среды

Создайте командный файл со следующим:

@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 будет применяться только к будущим командным приглашениям, но не будет возвращено в родительскую командную строку.

Примечание. Если командная строка прервана ненормально (нажав на красный крестик в окне или завершив задачу в диспетчере задач), она не будет запускать ваши команды выхода.

Дальнейшее чтение:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .