![Adicionando %USERPROFILE% a um comando no registro do Windows](https://rvso.com/image/1314324/Adicionando%20%25USERPROFILE%25%20a%20um%20comando%20no%20registro%20do%20Windows.png)
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 .reg
arquivo:
[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 reg
opçã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 .reg
també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 reg
comando em vez de um.reg
arquivo..
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_SZ
os 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.