运行 Inno Setup 安装程序时如何修改 PATH 环境变量?

2023-11-24

Inno Setup 允许您通过 [Registry] 部分设置环境变量(通过设置与环境变量相对应的注册表项)

然而,有时您不仅仅想设置环境变量。通常,您想修改它。例如:安装时,人们可能想要向 PATH 环境变量添加/删除目录。

如何从 InnoSetup 中修改 PATH 环境变量?


您提供的注册表项中的路径是 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;

请注意,在将常量作为参数传递给检查函数之前,您可能需要扩展常量,有关详细信息,请参阅文档。

在卸载期间从路径中删除此目录可以以类似的方式完成,并留给读者作为练习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行 Inno Setup 安装程序时如何修改 PATH 环境变量? 的相关文章

  • 如何从 Next.js 应用程序访问 Kubernetes 容器环境变量?

    在我的 next config js 中 我有一个如下所示的部分 module exports serverRuntimeConfig Will only be available on the server side mySecret s
  • PyCharm 未使用环境变量进行更新

    当我使用vim更新我的环境变量 在 bashrc PyCharm 不会立即获取更新 我必须关闭程序 源 bashrc再次 然后重新打开 PyCharm 有没有办法让 PyC harm 自动获取更改 或无需关闭 当任何进程创建时 它都会从其父
  • 如何在 .NET Core 中设置全局环境变量(用户范围或系统范围)

    在完整的 NET中我们可以通过EnvironmentVariableTarget枚举到Environment SetEnvironmentVariable call public enum EnvironmentVariableTarget
  • Inno Setup 提示用户输入文件夹并存储值

    我有以下需求 Run run robocopy exe source dest OLD source contents options Where source必须由目标计算机上的用户指定 这可以根据物理平台进行更改 目的地将与用户定义的源
  • 在 Inno Setup 中实现脚本常量时出现“预期标识符”或“原型无效”

    因此 鉴于此功能 我在GetRoot ROOTPage Values 0 线 我希望它告诉我ROOTPage没有定义 const DefaultRoot C IAmGRoot Var ROOTPage TInputQueryWizardPa
  • Inno-Setup:在消息框中使用自己的按钮文本

    良好的 GUI 设计中的常见做法是不使用是 否消息框 而是为按钮提供真实名称 例如保存或丢弃 我们如何在显示的消息框中实现这一点MsgBox在 InnoSetup 中 至少对于我们在代码部分中显示的那些 The MsgBox http ww
  • vcproj/vsprops 的可选环境变量

    有没有办法在项目文件 有或没有 vsprops 中进行环境变量替换 如果找不到该变量 则用默认值替换 我还没有找到任何方法来做到这一点 因为一切似乎都会覆盖环境变量 编辑 我需要它为属性工作 而不是为环境变量工作 具体来说 可以使用指定目标
  • 如何从 powershell 中设置 bash 的环境变量?

    使用powershell我该如何设置 https askubuntu com q 1205227 45156 the 环境 https stackoverflow com q 5327495 262852变量 这里 特别 https sta
  • Inno Setup 代码部分创建隐藏文件

    我正在处理 Inno Setup 项目 该项目正在使用SaveStringToFile函数在 Code 部分 我想将此文件设置为隐藏系统文件 但我无法找到有关如何实现此操作的信息 有任何想法吗 Inno Setup Pascal Scrip
  • Java环境变量设置方法

    我已将以下行插入 bash profile export GOOGLE APPLICATION CREDENTIALS Users jun Downloads export PATH PATH GOOGLE APPLICATION CRED
  • 在 Inno Setup 中单击“下一步”按钮时验证自定义页面上的数据

    我已经设法获得一个基本脚本来显示向导 使用CreateInputFilePage 供用户识别我用来更新 XML 文件中某些设置的文件位置 但是 我想对所选文件的输入进行一些基本检查 而不是简单地接受用户提供的任何内容 例如 如果用户在内容无
  • Vista幻影目录

    我们有一个程序 安装程序会检查配置文件是否存在 如果存在 它不会复制该文件 它假设用户已修改其配置文件并希望保留这些修改 不幸的是 这是一个 Vista 之前的应用程序 它将配置文件保存在 Program Files 中 问题是 如果你在重
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 从命令提示符/批处理文件添加环境变量

    我正在尝试在批处理文件中添加环境变量 系统 以下命令显示错误 语法无效 有人可以帮忙吗 对我来说它看起来不错 reg add HKLM SYSTEM CurrentControlSet Control Session Manager Env
  • 如何将 .env 文件变量传递给 webpack 配置?

    我是 webpack 的新手 几乎完成了所有构建部分 但现在的问题是我想将环境变量从 env 文件传递 到 webpack 配置 以便我可以通过以下方式将该变量传递到我的构建文件webpack DefinePlugin plugin 目前我
  • 为进程设置环境变量

    环境变量的概念是什么 在 C 程序中 我需要调用可执行文件 该可执行文件将调用驻留在同一文件夹中的一些其他可执行文件 可执行文件依赖于两个环境变量 PATH 和 RAYPATH 的正确设置 我尝试了以下两件事 我创建了一个进程并在 Star
  • 在 .NET 中获取远程计算机上环境变量的实际值

    我正在尝试获取实际值 of 环境变量 这是我到目前为止所拥有的 string query string Format Select VariableValue From Win32 Environment Where Name 0 vari
  • 在跨平台的 npm 脚本中使用环境变量

    我正在构建一个 package json 并使用 npm run 来运行一些脚本 确切地说 https docs npmjs com misc scripts https docs npmjs com misc scripts 我的脚本需要
  • 使用gunicorn和环境变量运行flask应用程序

    对于本地开发 我只需设置包含必要变量的 env 文件 然后运行应用程序 Flask run 一切看起来都很好 所有环境变量都在应用程序中正确读取和设置 但是 当我使用 Gunicorn 运行应用程序时 gunicorn api app bi
  • 如何将 .bat 文件中的变量获取到 PowerShell 脚本中?

    我正在用 PowerShell 替换 bat 脚本的部分内容 批处理文件的配置是通过以下文件完成的set适当的环境变量 我正在寻找一种方法将这些变量值加载到 ps1脚本 无需修改 bat文件 因为它们也在其他地方使用 一个例子 bat看起来

随机推荐

  • 连接到 MySQL 导致错误“未找到数据源名称且未指定默认驱动程序”

    我正在尝试使用 ASP NET Web 表单应用程序连接到 MySQL 数据库 我正在进行一项测试 将 MySQL 数据库中的数据绑定到GridView 这是我的代码 Dim strMySQLConn As String DRIVER My
  • iPhone 上的 OpenGL ES 1.1 或 2.0

    据我了解 iPhone 操作系统的升级将 OpenGL ES 版本支持从 1 1 升级到了 2 0 我一直无法找到的是是否应该努力使用 1 1 来向后兼容旧设备 Xcode 似乎建议我使用 2 0 因为它似乎只包含该版本 我应该使用2 0而
  • UDP 和套接字,recvfrom() 返回 -1 且资源暂时不可用

    我有一个客户端和一个服务器 在 C 中使用数据报 UDP 进行通信 客户端发送 5 条消息 收到消息后 服务器发回消息 在客户端完成接收消息之前 接收和发送消息都很好 服务器发回所有消息后 使用 close 终止 所以来自客户端的recvf
  • 清除所选选项卡中所有文本框的文本

    我有一个表格 其中有一个tab control每个选项卡都有多个textboxes labels and buttons 我想让用户能够清除所选选项卡文本框中的所有文本 我努力了 private void resetCurrentPageT
  • 如何在 OS X 10.8.4 上为 iOS 模拟器 (6.1) 编译 Boost 1.54.0 (1.54)?

    我已经成功地编译了几个 Boost 库 并使用以下脚本创建了一个与 OS X iOS 和 iOS 模拟器一起使用的框架 https github com wuhao5 boost blob 188e905626dbd522f65950102
  • 如何在 Perl 6 中使类参数化?

    通常在 Perl 6 中 只允许角色是参数化的 在这里 我们将尝试创建类 kind 从这里开始称为元对象 通常不允许是参数化的 参数化的 如果您尝试以简单的方式使类参数化 则会发生这种情况 bastille perl6 e class Fo
  • 为什么Chrome的隐身模式比正常模式检索资源更快?

    我在多台机器 台式机和笔记本电脑 和操作系统 Windows 和 Mac 上进行了测试 我可以复制相同的行为 在隐身模式下资源下载速度更快 不是渲染速度 我粗略地想到隐身模式和正常模式分别可以更快的两种情况 隐身模式可以更快 因为它没有扩展
  • 支持 goto 的 Java 编译器或 JVM 语言?

    是否有一个 java 编译器标志允许我使用goto作为一个有效的构造 如果没有的话有没有第三方java编译器支持goto 如果不支持的话还有其他语言支持吗goto同时可以方便的调用Java编写的方法 原因是我正在编写一种用 Java 实现的
  • 如何序列化静态类的非静态子类

    我想序列化一个非常普通的类 但问题是它嵌套在一个静态类中 如下所示 public static class StaticClass Serializable public class SomeType 这段代码 StaticClass So
  • Laravel 5.4 迁移时用户 root@localhost 访问被拒绝

    我对 Laravel 有一种奇怪的感觉 我有一个坏习惯 即使用 laravel 项目在虚拟盒子上创建项目进行测试 debian 最后稳定版当前为 9 1 nginx php7 1 MariaDB 在你告诉我去某个地方阅读另一篇文章之前 请阅
  • json 列与多列

    我什至不知道是否调用它序列化列是的 但我要解释一下自己 例如 我有一个用户表 我想存储用户的电话号码 手机 家庭 办公室等 所以 我想制作一个专栏对于每种数字类型 但同时我的脑海中浮现出一个想法 如果我保存一个怎么办 json字符串在一个列
  • 将 32 位变量移位 32 位有什么不好?

    我最近买了一本 Bruce Schneier 写的 应用密码学 读起来很不错 我现在了解了书中概述的几种算法是如何工作的 并且我想开始用 C 语言实现其中的一些算法 许多算法的共同点是将 x 位密钥划分为几个较小的 y 位密钥 例如 Blo
  • mongodb连接池

    我正在使用 Java 驱动程序来访问 mongodb 我假设数据库连接池是由驱动程序内部处理的 但是每次访问数据库时 我的连接计数都会增加 这是我的服务器状态日志 connections current 276 available 543
  • 将字符串插入到另一个字符串中

    好的 我有一个 char stringA 和 char stringB 我希望能够将 stringB 在 x 点插入到 stringA 中 char stringA abcdef char stringB 123 与产品 ab123cdef
  • “WCF”是什么意思? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 谁能定义WCF WCF 的目的是什么 有哪些学习 WCF 的好阅读材料 WCF Windows 通信基础 是 Microsoft 使用的名称框架 t
  • 为什么 IList<>.Reverse() 不像 List<>().Reverse 那样工作

    我有问题List
  • 复制时使用的理想内存块大小是多少?

    我目前使用每个内存块 100 MB 来复制大文件 人们通常使用的量是否 合适 Edit 感谢大家的精彩回复 我对这些概念还很陌生 所以我会尝试理解很多已经说过的概念 例如回写缓存 我不断学习新东西 4096 到 32KB 之间的块是典型的选
  • Apply 与 Map 的内存使用情况。虚拟内存的使用和锁定

    我需要找到一长串数字对中所有数字对的总和 在 Mathematica 中有很多方法可以做到这一点 但我正在考虑使用其中之一Plus or Total Since Total在列表上工作 Map是在那里使用的函数式编程工具Apply级别 1
  • 在 Python Selenium 中滚动特定 DIV 元素

    我正在尝试做一个简单的 Python Selenium 自动化 其中脚本将单击一个链接 该链接会在页面顶部打开一个对话框 Instagram 个人资料 该对话框将显示关注者列表 但不幸的是包含该列表的 UL 将仅显示前 12 个关注者 或
  • 运行 Inno Setup 安装程序时如何修改 PATH 环境变量?

    Inno Setup 允许您通过 Registry 部分设置环境变量 通过设置与环境变量相对应的注册表项 然而 有时您不仅仅想设置环境变量 通常 您想修改它 例如 安装时 人们可能想要向 PATH 环境变量添加 删除目录 如何从 InnoS