![将 %USERPROFILE% 添加到 Windows 注册表中的命令](https://linux22.com/image/1314324/%E5%B0%86%20%25USERPROFILE%25%20%E6%B7%BB%E5%8A%A0%E5%88%B0%20Windows%20%E6%B3%A8%E5%86%8C%E8%A1%A8%E4%B8%AD%E7%9A%84%E5%91%BD%E4%BB%A4.png)
我正在尝试编写一个注册表黑客程序,以便在创建新虚拟机或重新安装笔记本电脑时简化一些设置任务。我正在做的一件事是将我最喜欢的一堆应用程序(包括 Notepad++)切换到便携版本(在 Dropbox 中同步)。
我想创建一个注册表项,以便我在右键菜单中拥有使用 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
,但在这里我追求的是可移植性。
我很确定问题只是找到%
符号的正确转义序列,但很难说。
有什么建议吗?
编辑:我使用了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 文件中为 REG_EXPAND_SZ 输入十六进制字符串。
在 CMD 文件中编写 reg.exe 命令仍然更容易。
我们还可以执行以下操作,当通过 CMD 使用 reg.exe 时:
让 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% 相当于现在使用的。
但我为在 VM 中安装 XP 的 Mac 用户执行此操作以运行旧应用程序。;)
在 XP 中实际路径有所不同,但在 cmd 脚本中使用此方法会
为其运行的机器插入正确的路径。