2013-04-17 2 views
2

Я использую cygwin версию gvim для редактирования файлов в Windows, для чего я создал скрипт bat, который открывает файл с cygwin-версией gvim (путем преобразования пути в формат cygwin). Я также написал небольшой скрипт powershell для регистрации этого битового скрипта с помощью проводника Windows, поэтому я могу связать расширения файлов с помощью контекстного меню «открыть с». Вот сценарий:Как связать значок с пользовательским приложением (зарегистрированный скриптом powershell)

$ErrorActionPreference = "Stop" 
$classes="hkcu:\software\classes" 
$appid="cygwin.gvim" 
$apps="$classes\applications" 
$cmd='...SOMEDIRECTORY...\edit-gvim.bat' 
$friendlyname='gVim (Cygwin)' 
$icon='...ANOTHERDIRECTORY...\vim.ico' 
[email protected](".txt", ".ps1", ".sh", ".py", ".cs", ".cpp", ".c", ".rb", 
    ".zsh", ".bash", ".vbox", ".xml", ".yml", ".yaml", ".bat") 

if (test-path "$apps\$appid") { 
    # cleanup 
    remove-item -recurse "$apps\$appid" 
} 

# register open commands to know filetypes 
new-item -path "$apps\$appid\shell\open\command" -value "$cmd `"%1`"" -force 

# add a context menu item(edit with gVim) to every file in windows explorer 
new-item -path "$classes\*\shell\Edit with $friendlyname\command" -value "$cmd `"%1`"" -force 

# friendly name for the 'open with' dialog 
new-itemproperty -path "$apps\$appid\shell\open" -name 'FriendlyAppName' -value $friendlyname 

# register the icon 
# FIXME this has no effect 
new-item -path "$apps\$appid\DefaultIcon" -value $icon -type expandstring 

# register supported file extensions 
new-item -path "$apps\$appid\SupportedTypes" 
foreach ($ext in $filetypes) { 
    new-itemproperty -path "$apps\$appid\SupportedTypes" -name $ext -PropertyType string -value '' 
} 

Все работает за исключением строки ниже замечания «FIXME», который Aparently не имеет никакого эффекта. Вместо того, чтобы видеть мой предоставленный значок приложениями, связанными с gvim, я вижу значок по умолчанию для Windows для неизвестных типов файлов. Что мне здесь не хватает?

Вот некоторые ресурсы, которые я использовал, чтобы написать этот скрипт:

+0

Если вы посмотрите на регистр DefaultIcon reg в RegEdit, что вы видите? Создается ли он? Это тип REG_EXPAND_SZ? Имеет ли он правильное значение с '%' вокруг env var для расширения? –

+0

Он создается корректно с помощью REG_EXPAND_SZ (который управляется аргументом -type expandstring). Значение - полный путь к значку, нет переменных среды для расширения. Вы можете попробовать сценарий самостоятельно, предоставив некоторую иконку заглушки и файл bat. –

+0

Если для расширения нет переменных env, вам нужно всего лишь тип REG_SZ. Но я не думаю, что здесь проблема. Тип файла получает свой значок из hklm: \ software \ classes \. , где значение регистра по умолчанию указывает тип документа (например, txtfile для .txt). Тогда в hklm: \ software \ classes \ txtfile в этом случае стоит DefaultIcon. –

ответ

0

Я могу ошибиться, но, насколько Я понимаю синтаксис DefaultIcon:

"Full path to a file,ordinal" 

Это полезно, когда вы хотите, чтобы указать на ресурс в EXE или DLL

C:\Program Files (x86)\PowerGUI\ScriptEditor.exe,1 

Но вы должны иметь один и тот же синтаксис, если вы хотите, чтобы она указывала на иконку файл:

[HKEY_CLASSES_ROOT\AcroExch.acrobatsecuritysettings.1\DefaultIcon] 
@="C:\\Windows\\Installer\\{AC76BA86-7AD7-1036-7B44-A95000000001}\\PDFFile_8.ico,0" 

Таким образом, в вашем случае, я хотел бы попробовать:

$icon='...ANOTHERDIRECTORY...\vim.ico,0' 

или

$icon='...ANOTHERDIRECTORY...\\vim.ico,0' 

Отредактировано

Не забудьте перезапустить explroer.exe, чтобы увидеть новую иконку.

+0

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

+0

Вы пытаетесь убить explorer.exe и перезапустить его? В моем случае я вижу новый значок, когда explorer.exe перезагружается. – JPBlanc

+0

Вы использовали файл .bat? Вы можете увидеть значок, когда вы щелкните правой кнопкой мыши по файлу и выберите «открыть с»? –

Смежные вопросы