我写了一个Inno Setup脚本来安装程序,并用安装程序PATH
的目录更新环境变量。
我想更新PATH
环境变量,以恢复其先前的安装状态。
用户在安装程序运行时选择安装路径。
这是脚本,使用了运行Inno Setup Installer时如何修改PATH环境变量中的代码。
[Setup]
ChangesEnvironment=yes
[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: expandsz; ValueName: "PATH"; ValueData: "{olddata};{app}"; \
Check: NeedsAddPath('{app}')
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueName: "PATH"; ValueData: "{app}"; Flags: uninsdeletevalue
[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;
看一下代码,可以注意以下说明:
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueName: "PATH"; ValueData: "{app}"; Flags: uninsdeletevalue
我使用了该指令(针对我的示例进行了改编),以阅读Inno Setup。如何卸载注册表值?
uninsdeletevalue
卸载程序时,应使用删除值,实际上,当我运行卸载程序时,将PATH
删除整个变量,但是我需要将PATH
环境变量还原为以前的安装值。我认为可以在运行安装程序之前读取其值,但是我不知道如何在卸载阶段使用它。
有人可以帮我提供代码示例吗?
[Registry]
仅使用部分条目进行卸载时,Inno Setup不能记住安装和恢复时的值。
虽然您可以对其进行编码,但它并不是一个好方法,因为PATH
安装后可能会发生更改,并且您将放弃所有此类更改。
您必须在中搜索PATH
路径,然后仅删除路径。
const
EnvironmentKey = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
procedure RemovePath(Path: string);
var
Paths: string;
P: Integer;
begin
if not RegQueryStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) then
begin
Log('PATH not found');
end
else
begin
Log(Format('PATH is [%s]', [Paths]));
P := Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(Paths) + ';');
if P = 0 then
begin
Log(Format('Path [%s] not found in PATH', [Path]));
end
else
begin
if P > 1 then P := P - 1;
Delete(Paths, P, Length(Path) + 1);
Log(Format('Path [%s] removed from PATH => [%s]', [Path, Paths]));
if RegWriteStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) then
begin
Log('PATH written');
end
else
begin
Log('Error writing PATH');
end;
end;
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
RemovePath(ExpandConstant('{app}'));
end;
end;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句