Agregar %USERPROFILE% a un comando en el registro de Windows

Agregar %USERPROFILE% a un comando en el registro de Windows

Estoy intentando escribir un truco de registro que agilizará algunas de mis tareas de configuración cuando creo una nueva máquina virtual o repave mi computadora portátil. Una cosa que estoy haciendo es cambiar a versiones portátiles (sincronizadas en Dropbox) de varias de mis aplicaciones favoritas, incluido Notepad++.

Quiero crear una entrada de registro que me permita tener la opción Abrir con Notepad++ en mi menú contextual, que es lo único que me falta en la versión portátil. Sin embargo, recibo un error:

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

Aquí está mi .regarchivo:

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

El icono funciona perfectamente. Puedo hacer que la entrada anterior funcione bien si codifico C:\Users\myusername, pero aquí voy por la portabilidad.

Estoy bastante seguro de que el problema es simplemente encontrar la secuencia de escape correcta para los %símbolos, pero es difícil decirlo.

¿Sugerencias?

EDITAR: elegí la add regopción de comando y, después de un poco de prueba y error, aquí está el comando que funcionó:

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

.regDespués de ejecutar el comando, también exporté los resultados como un archivo. Gana por todos lados.

Respuesta1

Para utilizar (expandir) variables de entorno en el registro, el valor debe ser del tipoREG_EXPAND_SZ.

Residencia enesta pregunta, sería más fácil agregar ese tipo de valor con el regcomando en lugar de un.regarchivo..

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

Consulte reg add /?para obtener más información sobre esta sintaxis.

También puedes codificar los datos como hexadecimal. Hay algunos ejemplos de eso.aquí:

REG_EXPAND_SZLos datos deben presentarse como lo que MS llama unbinariotipo de datos (subtipo "2"), por lo que el valor debe formatearse en una especie de formato hexadecimal, delimitado por comas, dos tokens por byte (rellenados con ceros), con un byte nulo final, por supuesto (y obviamente faltan más explicaciones). más allá del alcance de este artículo, y el autor no será responsable del mal uso que alguien haga de la información incompleta proporcionada hasta ahora). Entonces, la línea anterior no funcionará pero indica el resultado final que quería lograr. Como entrada de archivo .REG que funciona realmente, el ejemplo anterior debe representarse como:

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

se convierte

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

Respuesta2

12 años después, en Windows 11, todavía necesitamos cadenas hexadecimales para REG_EXPAND_SZ en archivos .reg.
Escribir comandos reg.exe en un archivo CMD es aún más fácil para esto.

También podemos hacer lo siguiente, cuando usamos reg.exe a través de CMD:
dejar que env-varsexpandir en CMD, entonces ellosingrese al registro como cadenas simples.
La sintaxis es un poco más simple, ya que omite ^ antes del %,
y cita toda la cadena. Recuerde establecer el 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

Mientras no muevas la "carpeta conocida" a otro lugar,
la ruta codificada seguirá funcionando.

%AllUsersProfile% es antiguo, compatible con XP.
%ProgramData% es el equivalente a usar en estos días.
Pero hago esto para usuarios de Mac que tienen XP en una VM para ejecutar una aplicación antigua. ;)

La ruta real es diferente en XP, pero al usar este método en un script cmd
se inserta la ruta correcta para la máquina en la que se ejecuta.

información relacionada