Я использую 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 для неизвестных типов файлов. Что мне здесь не хватает?
Вот некоторые ресурсы, которые я использовал, чтобы написать этот скрипт:
- http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx
- http://msdn.microsoft.com/en-us/library/cc144158(VS.85).aspx
- http://msdn.microsoft.com/en-us/library/windows/desktop/cc144101(v=vs.85).aspx
- Create registry entry to associate file extension with application in C++
Если вы посмотрите на регистр DefaultIcon reg в RegEdit, что вы видите? Создается ли он? Это тип REG_EXPAND_SZ? Имеет ли он правильное значение с '%' вокруг env var для расширения? –
Он создается корректно с помощью REG_EXPAND_SZ (который управляется аргументом -type expandstring). Значение - полный путь к значку, нет переменных среды для расширения. Вы можете попробовать сценарий самостоятельно, предоставив некоторую иконку заглушки и файл bat. –
Если для расширения нет переменных env, вам нужно всего лишь тип REG_SZ. Но я не думаю, что здесь проблема. Тип файла получает свой значок из hklm: \ software \ classes \., где значение регистра по умолчанию указывает тип документа (например, txtfile для .txt). Тогда в hklm: \ software \ classes \ txtfile в этом случае стоит DefaultIcon. –