您提供的注册表项中的路径是 type 的值REG_EXPAND_SZ
。作为 Inno Setup 文档[注册表]部分指出有一种方法可以将元素附加到这些元素上:
On a string
, expandsz
, or multisz
类型值,您可以使用一个特殊的常量,称为{olddata}
在这个参数中。{olddata}
被替换为注册表值的先前数据。这{olddata}
如果您需要将字符串附加到现有值,则常量可能很有用,例如,{olddata};{app}
。如果该值不存在或者现有值不是字符串类型,则{olddata}
常量被默默地删除。
因此,可以使用与此类似的注册表部分附加到路径:
[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"
这会将“C:\foo”目录附加到路径中。
不幸的是,当您第二次安装时,这会重复出现,这也应该得到修复。 ACheck
带有 Pascal 脚本中编码的函数的参数可用于检查路径是否确实需要扩展:
[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"; \
Check: NeedsAddPath('C:\foo')
该函数读取原始路径值并检查给定目录是否已包含在其中。为此,它会在前面和后面添加分号字符,这些分号字符用于分隔路径中的目录。考虑到搜索的目录可能是第一个或最后一个元素,分号字符也被前置并附加到原始值:
[Code]
function NeedsAddPath(Param: string): boolean;
var
OrigPath: string;
begin
if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
'Path', OrigPath)
then begin
Result := True;
exit;
end;
{ look for the path with leading and trailing semicolon }
{ Pos() returns 0 if not found }
Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
end;
请注意,在将常量作为参数传递给检查函数之前,您可能需要扩展常量,有关详细信息,请参阅文档。
在卸载期间从路径中删除此目录可以以类似的方式完成,并留给读者作为练习。