Посты с тагом консоль
29
апреля
2008

Расширяем возможности контекстного меню Explorer

Возможность добавить в контекстное меню Windows Explorer пункт «Open console here» давно не была новостью. Но необходимость в ее использовании всерьёз возникла только недавно. Когда приходится по десять раз в день открывать консоль и нудную писать команду перевода текущей директории из этого ужасного «C:\Documents and Settings\…» куда надо, поневоле задумаешься о том, как упростить процесс.

А упростить его не сложно. Если добавить в реестр перечисленные ниже ключи, в контекстном меню появится новый пункт для открытия консольного окна в выбранной директории:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd_root]
@="Open console here"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd_root\command]
@="Cmd.exe /k pushd \"%L\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd_root]
@="Open console here"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd_root\command]
@="Cmd.exe /k pushd \"%L\""

Альтернативный вариант для открытия консоли с правами администратора (может быть полезен, если ваш действующий пользовательский профиль этими правами обделен):

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd_root]
@="Open root console here"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd_root\command]
@="runas /user:COMPUTER_NAME\\AdministratorName \"Cmd.exe /k pushd %L\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd_root]
@="Open root console here"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd_root\command]
@="runas /user:COMPUTER_NAME\\AdministratorName \"Cmd.exe /k pushd %L\""

COMPUTER_NAME и AdministratorName, как не сложно догадаться, заменяются на имя машины и администратора соответственно. Пароль будет запрашиваться при открытии административной консоли.

Если лень возиться с реестром, можно воспользоваться программой из комплекта Microsoft PowerToys. Понадобится та, что называется «Open Command Window Here». Но на мой взгляд, скопировать ключи в .reg файл и импортировать в реестр проще, чем искать для этого специальную утилиту.

Пока я искал гуглом приведенные выше ключи реестра, пришла мысль об автоматизации еще одного рутинного действия. Время от времени, для сортировки файлов я часто использую директории с именами в формате YYYYMMDD-desc (YYYYMMDD — текущая дата, desc — описание). По такому принципу, например, организуются черновики постов для блога, архивы документов, скачанные файлы, которые нужно разобрать и много еще чего.

Для генерации таких директорий я добавил еще один пункт в контекстное меню. В отличии от первого примера, здесь запускается небольшой скрипт на python, который, собственно, директорию и создает (скрипт приведен ниже).

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd_tmp]
@="Create temp directory"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Directory\shell\cmd_tmp\command]
@="d:\\serv\\python25\\pythonw.exe d:\\pro\\mkdir.py \"%L\""

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd_tmp]
@="Create temp directory"

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Drive\shell\cmd_tmp\command]
@="d:\\path\\python25\\pythonw.exe d:\\path\\mkdir.py \"%L\""

Перед импортированием в реестр, понадобится заменить путь к скрипту mkdir.py и интерпретатору pythonw на реальные значения.

Вполне возможно, что генерировать date-based folder names можно и без питона, ограничившись командами консольного интерпретатора. Но, во-первых, на момент написания скрипта, я не знал, как это делается, во-вторых, скрипт при каждом вызове может генерировать новую директорию, добавляя к дате дополнительный числовой индекс (при повторном вызове, индекс инкрементируется). В том, что последнюю деталь можно реализовать в bat-файле я сомневаюсь.

from sys import argv, exit
from os import mkdir, path
from time import strftime

try:
    dir_path = argv[1]
except:
    dir_path = "."

i = 0

while i < 10000:
    dir_name = dir_path + "/%s-%03d" % (strftime("%Y%m%d"), i)
    if not path.isdir(dir_name):
        break
    i += 1
else:
    exit()

mkdir(dir_name)

На всякий случай в скрипте сделано ограничение на максимальное количество директорий. Если у кого-то есть конструктивные комментарии относительно улучшения кода — с интересом выслушаю, т.к. на питоне начал писать совсем недавно.

Да, и еще одна деталь. Все описанные выше модификации реестра проверены на Windows XP. Будет ли это работать на Висте мне не известно. Предполагаю, что будет.

Все примеры из поста можно скачать в одном архиве: explorer-console-menu-ext.zip.