2

Я знаю, как установить заголовок в качестве текущего каталога в обычном пакетном файле.

Я хочу сделать это для окна cmd, которое открывается, когда вы делаете "окно командной строки здесь" из папки Windows (автоматически).

Я знаю, что вы можете запустить командный файл при запуске любого cmd, и я видел ответы, чтобы получить имя каталога, но попытка получить имя каталога дает вам только прямое имя, где находится этот файл autorun.cmd , а не каталог имя, в которое "открыть окно командной строки" можно cd .

Кажется, что во время вызова autorun.cmd него еще нет информации о каталоге, который изменится в зависимости от того, из какого "открытого окна команды здесь" было вызвано. Это тот случай? Или все же есть способ автоматически изменить заголовок на текущий каталог?

3 ответа3

2

Я бы попробовал следующую строку:

for %a in (.) do title %~na

Или в командном файле вы бы однажды избежали % s:

for %%a in (.) do title %%~na

Цикл for...do предназначен только для того, чтобы получить текущий путь к переменной, поскольку вы не можете использовать оператор ~ с переменными окружения, такими как (%cd%).

Однако, как вы заметили, это не сработает для "Командной строки здесь", так как она выполняется до того, как каталог установлен.

Чтобы обойти это, вам, по сути, придется изменять вызываемую командную строку всякий раз, когда вы используете эту функциональность.

Это контролируется двумя переменными в Реестре, обе являются HKEY_CLASSES_ROOT\Directory:

HKEY_CLASSES_ROOT\Directory\shell\cmd\command: этот ключ определяет команду, запускаемую при нажатии Shift + правой кнопкой мыши на значке каталога / папки.

HKEY_CLASSES_ROOT\Directory\Background\shell\cmd\command: этот ключ определяет команду, запускаемую при нажатии клавиши Shift + щелчок правой кнопкой мыши где-нибудь в открытом окне проводника.

По умолчанию оба эти значения по умолчанию установлены в cmd.exe /s /k pushd "%V" , что откроет окно командной строки и изменит каталог на параметр, переданный как %V

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

cmd.exe /s /k "pushd ""%V"" && for %%A in (%V) do @title %%~nA"

Обратите внимание на двойные кавычки, чтобы правильно избежать их, поскольку все заключено в одну пару кавычек, чтобы сгруппировать все для параметра cmd.exe s /k . Знак @ скрывает команду от показа внутри окна команд.

Это работает для меня, но есть одна небольшая причуда: если имя вашего каталога содержит более одной точки, например one.two.three , это будет называть заголовок one.two .

Также имейте в виду, что название не будет обновляться, когда вы CD в другой каталог. Заставить это работать было бы немного сложнее (или, возможно, даже невозможно; не пытался).

1

Вдохновленный этим вопросом, я добавил забавную функциональность в командную строку в моей Windows: псевдо- команды cdn , pushdn и popdn (завершающий N = аббревиатура new или naming или даже nonsens или все остальное), соответствующие командам cd , pushd и popd . Эти псевдо- команды помогают сохранить заголовок моего окна cmd параллельно пути к текущему каталогу cmd следующим образом:

current directory    window title
------------------   --------------
X:\subpath\subfold   X:\ ..\subfold 
X:\folder            X:\folder
X:\                  X:\

для любого диска X: и произвольная глубина subpath .

Пример кода: cdn.bat помещается в любую папку, явно указанную в переменной среды path .

@rem cdn.bat
@rem change directory (and drive) || abort script processing in case of bad success
@cd /D %* || @goto :eof
@rem eliminate (if any in %*) trailing backslashes, surrouding double-quotes
@rem and/or (combined) symbols to current, parent or root directory (., .., \)
@call :window_title "%CD%"
@rem or, to title window to bare folder name, use: 
@rem @for /F "tokens=*" %%G in ("%CD%") do @title %%~nG%%~xG
@goto :eof

:window_title
  @if "%~p1%~n1%~x1" == "\%~n1%~x1" (
    @rem window title to 'X:\folder' on highest-level path or to 'X:\' on drive root
    @title %~d1%~p1%~n1%~x1
  ) else (
    @rem window title to 'X:\...\folder' otherwise (i.e. nor root, nor highest-level)
    @title %~d1^\ ..^\%~n1%~x1
  )
  @exit /B

Удовольствие, разделяющее мой восторг.

0

Теперь можно автоматически обновляться после любой команды, без переопределения «cd» и т.д. См. Изменение командной строки, чтобы показать только текущее имя каталога

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