Установите заголовок "open command window here" в качестве каталога, из которого он был вызван

698
laggingreflex

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

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

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

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

Установите заголовок

2
Действительно ли важно, чтобы в заголовке всегда отображался текущий каталог, или этого достаточно, чтобы показать каталог запуска? Mario 9 лет назад 0
возможный дубликат [cmd.exe, настраивающего расширение оболочки «Открыть командную строку здесь»] (http://superuser.com/questions/414155/cmd-exe-customizing-the-open-command-prompt-here-shell-extension ) MBu 9 лет назад 0

3 ответа на вопрос

2
Mario

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

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 в другой каталог. Заставить это работать было бы немного сложнее (или, возможно, даже невозможно; не пытался).

Спасибо!!! Две вещи: в моем случае это было `HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes \ Directory \ background \ shell \ cmd \ command`. И: Он игнорирует пробелы (дает название «Папка» для «Новая папка») laggingreflex 9 лет назад 0
@laggingreflex: Это по сути тот же путь. `HKCR` это просто" ярлык ". :) Что касается игнорирования пробелов: Да, это, вероятно, некоторый остаток от старых времен DOS (как ограничение одной точкой). Mario 9 лет назад 0
Хм. Я попробовал это, и это не сработало. Затем я искал в regedit команду «cmd.exe / s / k pushd«% V »» и нашел несколько записей, некоторые из которых мне не удалось отредактировать (некоторые ошибки). Это был тот, который я наконец отредактировал, и это сработало. Может быть, это только для моего случая, у меня есть некоторые настройки, поэтому мне не нужно удерживать Shift, чтобы получить «открытое окно команд». laggingreflex 9 лет назад 0
Чтобы избежать нажатия клавиши Shift, просто перейдите по пути, описанному в моем ответе, и удалите значение «Extended» под клавишами «cmd». Хотя это действительно возможно, некоторые другие средства редактируют разрешения и тому подобное, чтобы избежать дальнейших изменений / перезагрузок. Mario 9 лет назад 0
Это не только ваш случай, специальные папки, такие как рабочий стол и т. Д. Обрабатываются другими ключами в реестре. И нет необходимости использовать команду `for`, достаточно` cmd.exe / s / k "pushd" "% V" "& title% V" `. См. Этот вопрос: http://superuser.com/questions/414155/cmd-exe-customizing-the-open-command-prompt-here-shell-extension (Ранее, когда я писал свой ответ на ваш вопрос, я забыл, что вопрос был уже где-то ответили) MBu 9 лет назад 0
@MBu Это приведет к тому, что весь путь будет в строке заголовка. Цель состояла в том, чтобы иметь только фактическое имя папки (но не путь). Mario 9 лет назад 0
Вы правы, извините :-) MBu 9 лет назад 0
@MBu Это тесно связано, только немного расширено. Кроме того, специальные папки являются хорошей запиской, о которой я полностью забыл. :) Mario 9 лет назад 0
Перепишите этот цикл `for`, чтобы игнорировать пробелы и точки в пути к папке: должно быть` @for / F "tokens = *" %% G in ("% CD%") do @title %% ~ nG %% ~ xG `и я бы использовал` cd / D` вместо `pushd`, поскольку мне не нужно подходящее` popd` JosefZ 9 лет назад 0
@JosefZ Интересно. :) Я сохранил `pushd` просто из-за того, что это значение по умолчанию. Mario 9 лет назад 0
И обнаружил, что должен быть удвоенный знак процента %% в коде, который я предоставил: `in ("% CD% ")`. Однако здесь доступны допустимые синтаксисы для этих значений реестра: либо `cmd.exe / D / K cd / D"% 1 "&& @for / F" tokens = * "%% G in ("% 1 ") do @ title %% ~ nG %% ~ xG` или `cmd.exe / D / K cd / D"% 1 "&& @for / F" tokens = * "%% G in (" %% CD %% ") сделать @title %% ~ nG %% ~ xG`. Обратите внимание на двойной знак амперсанда, пожалуйста: переименование не выполняется, если по какой-либо причине произошла ошибка при смене каталога, таким образом, пользователь сразу же получает сообщение: что-то было не так JosefZ 9 лет назад 0
@JosefZ Я проверил это, и похоже, что ** `% V` **,`% 1` или `% CD%` не работают. `cmd.exe / D / K cd / D"% V "&& for / F" tokens = * "%% G in ("% V ") do @title %% ~ nG %% ~ xG`. Спасибо за создание каталогов с пробелами. laggingreflex 9 лет назад 0
На пути к `"% V "` по сравнению с `"% 1 "`: ИМХО, поскольку я нахожусь на _retired_ Win-XP, это конкретное событие подхода Microsoft к _обратной совместимости_ :-) JosefZ 9 лет назад 0
Я также обнаружил, что `cd` вместо` pushd` делает `autorun.cmd` (как упомянуто в моих оригинальных заданиях) не работающим. Кажется, «pushd» - лучший вариант. laggingreflex 9 лет назад 0
1
JosefZ

Inspired by the question, I have added some fun functionality to the command line on my Windows: pseudocommands cdn, pushdn and popdn (trailing N = acronymous new or naming or even nonsens or whatever else) corresponding to cd, pushd and popd commands. Those pseudocommands help to keep my cmd window title parallel to the cmd current directory path as follows:

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

for any drive X: and arbitrary depth of subpath.

Code example: cdn.bat placed to any folder explicit in the path environment variable.

@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 

Pleasure sharing my delight.

0
mike_n

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

Добро пожаловать в Супер пользователя! Как и в случае с другим вашим ответом (идентичным этому), [было бы предпочтительнее] (// meta.stackoverflow.com/q/8259) включить здесь основные части ответа и предоставить ссылку для справки. bertieb 5 лет назад 0
Кроме того, ссылка была удалена, так что эта ссылка нигде не указывает. fixer1234 5 лет назад 0