Я пытаюсь написать хак реестра, который упростит некоторые из моих задач по настройке, когда я создаю новую виртуальную машину или переделываю свой ноутбук. Одна из вещей, которую я делаю, это перехожу на портативные версии (синхронизированные в Dropbox) нескольких моих любимых приложений, включая Notepad++.
Я хочу создать запись в реестре, чтобы иметь возможность открыть в меню правой кнопки мыши опцию «Открыть с помощью Notepad++», которая является единственным, чего мне не хватает в портативной версии. Однако я получаю ошибку:
Windows cannot access the specified device, path or file. You may not have the
appropriate permissions to access the item.
Вот мой .reg
файл:
[HKEY_CLASSES_ROOT\*\shell\Open with Notepad++]
"Icon"="%USERPROFILE%\\Dropbox\\Programs\\Setup\\Icons\\Notepad++.ico"
@=""
[HKEY_CLASSES_ROOT\*\shell\Open with Notepad++\command]
@="%USERPROFILE%\\Dropbox\\Programs\\Notepad++\\notepad++.exe %1"
Значок работает отлично. Я могу заставить запись выше работать нормально, если я жестко закодирую C:\Users\myusername
, но я здесь стремлюсь к переносимости.
Я почти уверен, что проблема заключается в поиске правильной последовательности перехода к символам %
, но сложно сказать.
Предложения?
EDIT: Я выбрал add reg
вариант с командой, и после нескольких проб и ошибок вот команда, которая сработала:
reg add HKCR\*\shell\OpenWithNotepad++\command /t REG_EXPAND_SZ /ve /d ^%USERPROFILE^%"\Dropbox\Programs\Notepad++\notepad++.exe %1"
После выполнения команды я .reg
также экспортировал результаты в виде файла. Победы во всех отношениях.
решение1
Для использования (расширения) переменных среды в реестре значение должно иметь типREG_EXPAND_SZ
.
На основеэтот вопрос, было бы проще добавить такое значение с помощью reg
команды, а не.reg
файл..
reg add <KEY> /v <NAME> /t REG_EXPAND_SZ /d <DATA>
reg add /?
Более подробную информацию об этом синтаксисе см .
Вы также можете закодировать данные в шестнадцатеричном формате. Вот несколько примеров этогоздесь:
REG_EXPAND_SZ
данные должны быть представлены в виде того, что MS называетдвоичныйтип данных (подтип "2"), поэтому значение должно быть отформатировано в своего рода шестнадцатеричном формате, разделенном запятыми, два токена на байт (дополненных нулями), с завершающим нулевым байтом, конечно (и дальнейшее объяснение, очевидно, выходит далеко за рамки этой статьи, и автор не будет нести ответственности за чье-либо неправильное использование неполной информации, предоставленной до сих пор). Поэтому строка выше не будет работать, но указывает на конечный результат, которого я хотел добиться. Как реальная рабочая запись .REG-файла, пример выше должен быть отображен как:
"SoMeThIng"="%WINDIR%\\system32"
становится
"SoMeThIng"=hex(2):22,25,57,49,4e,44,49,52,25,5c,5c,73,79,73,74,65,6d,33,32,22,00
решение2
12 лет спустя, в Windows 11, нам все еще нужны шестнадцатеричные строки для REG_EXPAND_SZ в .reg-файлах.
Написание команд reg.exe в CMD-файле для этого все еще проще.
Мы также можем сделать следующее при использовании reg.exe через CMD:
разрешить env-varsразвернуть в CMD, поэтому онив реестр вводить как простые строки.
Синтаксис немного проще, так как вы пропускаете ^ перед %
и заключаете в кавычки всю строку. Не забудьте установить тип как REG_SZ.
reg add HKCU\Software\Classes\*\shell\OpenWithNPP\command /t REG_SZ /ve /d "%AllUsersProfile%\apps\npp\notepad++.exe %1"
REG QUERY HKCU\Software\Classes\*\shell\OpenWithNPP\command /s
Результат:
HKEY_CURRENT_USER\Software\Classes\*\shell\OpenWithNPP\command
(Default) REG_SZ C:\ProgramData\apps\npp\notepad++.exe %1
До тех пор, пока вы позже не переместите «известную папку» в другое место,
жестко заданный путь будет продолжать работать.
%AllUsersProfile% — древний, совместимый с XP.
%ProgramData% — эквивалент для использования в наши дни.
Но я делаю это для пользователей Mac, у которых XP в виртуальной машине, чтобы запустить старое приложение. ;)
Фактический путь в XP отличается, но использование этого метода в скрипте cmd
вставляет правильный путь для машины, на которой он запущен.