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

标签 windows environment-variables installation inno-setup pascalscript

我写了一个 Inno Setup 脚本来安装程序并更新 PATH 环境变量,包含程序安装目录。

我想更新PATH环境变量,恢复之前的安装状态。

安装路径由用户在安装程序运行时选择。

这是脚本,它使用来自 How do I modify the PATH environment variable when running an Inno Setup Installer? 的代码

[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. How to uninstall registry value?

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(HKLM, 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(HKLM, 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;

关于windows - Inno Setup - 卸载程序时从 PATH 环境变量中删除路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35410421/

相关文章:

node.js - 将子进程的输出保存在 NodeJS 父进程的变量中

environment-variables - 如果以管理员身份运行,RDP "ClientName"环境变量为空

node.js - NodeJS模块安装

python - 导入模块在 Jupyter Notebook 中有效,但在 IDLE 中无效

linux - 虚拟机 "pc1"Netkit错误?

windows - 如何从 Oracle 11g XE 导出 'database' 并将其导入到 Oracle 10.2?

c++ - C/C++ Windows 或 Linux 将随机内存块映射为连续顺序

windows - 尝试在 Windows 命令行中运行 lcov 时不断出现 gcov 错误

windows - Windows 中的互斥与事件

c - 我的代码给出了 Linux 上的环境变量