Inno Setup-卸载程序时从PATH环境变量中删除路径

米利奥利·卢卡(Milioli Luca)

我写了一个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环境变量还原为以前的安装值。我认为可以在运行安装程序之前读取其值,但是我不知道如何在卸载阶段使用它。

有人可以帮我提供代码示例吗?

马丁·普里克里(Martin Prikryl)

[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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Inno setup Classic ASP启用父路径

来自分类Dev

Inno Setup中较大的“选择组件”页面

来自分类Dev

Inno Setup中的[Run]程序无法识别环境变量[不可用]

来自分类Dev

如何覆盖Inno Setup中的功能?

来自分类Dev

如何从Inno Setup安装程序设置全局环境变量?

来自分类Dev

Inno Setup [Code]部分变量为[Registry]

来自分类Dev

inno setup中的“ Not in a loop”错误

来自分类Dev

在Inno Setup中取消安装

来自分类Dev

Inno Setup中的TTreeView

来自分类Dev

Inno Setup中的条件DisableProgramGroupPage

来自分类Dev

在Inno Setup中创建ZIP文件

来自分类Dev

在Inno Setup中从XML导入计划的任务

来自分类Dev

在Inno Setup中复制隐藏文件

来自分类Dev

如何使用Inno Setup的[Code]部分中的值设置注册表项(环境变量)?

来自分类Dev

Inno Setup中AppData \ LocalLow的常量?

来自分类Dev

在Inno Setup中从过程调用函数?

来自分类Dev

Inno Setup:在卸载过程中从安装程序读取文件

来自分类Dev

在Inno Setup中删除XML元素的内容

来自分类Dev

卸载程序中的Inno Setup脚本常量

来自分类Dev

在Inno Setup中记录TWindowsVersion

来自分类Dev

Inno Setup,[运行]中参数中的空格

来自分类Dev

在Inno Setup Pascal脚本中声明变量

来自分类Dev

Inno Setup用户主路径

来自分类Dev

Inno Setup:从测试文件中删除空行

来自分类Dev

自动更新Inno Setup程序

来自分类Dev

Inno Setup-不获取环境变量

来自分类Dev

使用Inno Setup创建透明的安装程序?

来自分类Dev

Inno Setup 中的动态密码

来自分类Dev

Inno setup 只删除文件夹