Adicionando %USERPROFILE% a um comando no registro do Windows

Adicionando %USERPROFILE% a um comando no registro do Windows

Estou tentando escrever um hack de registro que agilize algumas das minhas tarefas de configuração quando eu criar uma nova VM ou reformar meu laptop. Uma coisa que estou fazendo é mudar para versões portáteis (sincronizadas no Dropbox) de vários dos meus aplicativos favoritos, incluindo o Notepad++.

Quero criar uma entrada de registro para permitir a opção Abrir com Notepad ++ no menu do botão direito, que é a única coisa que falta na versão portátil. Estou recebendo um erro:

Windows cannot access the specified device, path or file. You may not have the 
appropriate permissions to access the item.

Aqui está meu .regarquivo:

[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"

O ícone funciona perfeitamente. Posso fazer com que a entrada acima funcione bem se eu codificar C:\Users\myusername, mas estou buscando portabilidade aqui.

Tenho certeza de que o problema é apenas encontrar a sequência de escape correta para os %símbolos, mas é difícil dizer.

Sugestões?

EDIT: optei pela add regopção de comando e, depois de algumas tentativas e erros, aqui está o comando que funcionou:

reg add HKCR\*\shell\OpenWithNotepad++\command /t REG_EXPAND_SZ /ve /d ^%USERPROFILE^%"\Dropbox\Programs\Notepad++\notepad++.exe %1"

Depois de executar o comando, exportei os resultados .regtambém como um arquivo. Ganha por toda parte.

Responder1

Para usar (expandir) variáveis ​​de ambiente no registro, o valor deve ser do tipoREG_EXPAND_SZ.

Baseado emessa questão, seria mais fácil adicionar esse tipo de valor com o regcomando em vez de um.regarquivo..

reg add <KEY> /v <NAME> /t REG_EXPAND_SZ /d <DATA>

Consulte reg add /?para obter mais informações sobre esta sintaxe.

Você também pode codificar os dados como hexadecimal. Existem alguns exemplos dissoaqui:

REG_EXPAND_SZos dados devem ser apresentados como o que o MS chama debináriotipo de dados (subtipo "2"), portanto o valor deve ser formatado em um tipo de formato hexadecimal, delimitado por vírgula, dois tokens por byte (preenchido com zeros), com um byte nulo final, é claro (e explicações adicionais estão obviamente longe além do escopo deste artigo, e o autor não será responsabilizado pelo uso indevido das informações incompletas fornecidas até o momento). Então a linha acima não vai funcionar mas indica o resultado final que eu queria alcançar. Como uma entrada de arquivo .REG funcional real, o exemplo acima deve ser renderizado como:

"SoMeThIng"="%WINDIR%\\system32"

torna-se

"SoMeThIng"=hex(2):22,25,57,49,4e,44,49,52,25,5c,5c,73,79,73,74,65,6d,33,32,22,00

Responder2

12 anos depois, no Windows 11, ainda precisamos de strings hexadecimais para REG_EXPAND_SZ em arquivos .reg.
Escrever comandos reg.exe em um arquivo CMD ainda é mais fácil para isso.

Também podemos fazer o seguinte, ao usar reg.exe via CMD:
deixe o env-varsexpandir no CMD, então elesinsira o registro como strings simples.
A sintaxe é um pouco mais simples, pois você omite ^ antes de%
e cita a string inteira. Lembre-se de definir o tipo como 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

Resultado:

HKEY_CURRENT_USER\Software\Classes\*\shell\OpenWithNPP\command
    (Default)    REG_SZ    C:\ProgramData\apps\npp\notepad++.exe %1

Contanto que você não mova posteriormente a "pasta conhecida" para algum outro local,
o caminho codificado continuará funcionando.

%AllUsersProfile% é antigo, compatível com XP.
%ProgramData% é o equivalente ao uso atualmente.
Mas faço isso para usuários de Mac que possuem XP em uma VM para executar um aplicativo antigo. ;)

O caminho real é diferente no XP, mas usar esse método em um script cmd
insere o caminho correto para a máquina em que é executado.

informação relacionada