【问题标题】:Re-read environment variables from VBScript从 VBScript 重新读取环境变量
【发布时间】:2017-11-07 13:28:48
【问题描述】:

我正在从 MSI 安装程序(使用 WiX 工具集创建)运行 VBScript。此脚本使用 PATH 环境变量检查是否有其他软件 安装与否。安装程序还提供了一个重试按钮,可以再次运行脚本。

现在的问题是:如果在我的安装程序运行时更改了 PATH 环境变量,我的脚本将不会检测到该更改。我的脚本仅在重新启动安装程序后使用 PATH 环境变量的新值。

所以问题是这样的:如何强制安装程序使用 VBScript 更新其环境变量副本?

编辑:

看起来this article 解释了如何使用 PowerScript 解决问题。但我需要 VBScript 的解决方案。

【问题讨论】:

  • 必须有更好的方法来检测是否安装了其他软件,例如注册表项、ProductCode、组件 guid、文件搜索。另请注意,在您的安装过程中,另一个 MSI 无法运行。由于 MSI 处理环境变量的方式,不太可能有简单的修复,所以我会为其他软件寻找另一种检测方法,而不用担心安装过程中 PATH 的变化。

标签: vbscript scripting wix windows-installer environment-variables


【解决方案1】:

或者,来自 jscript(仍然是 cscript 解释器,但是 jscript 语言)

// Re-read PATH vars in case they've changed
var shell = new ActiveXObject("WScript.shell");
var newPath = (shell.Environment("USER")("PATH") + ";" + shell.Environment("SYSTEM")("PATH")).replace(/;;/g, ";");
// Expand any %STRINGS% inside path and set to the new running process
shell.Environment("PROCESS")("PATH") = shell.ExpandEnvironmentStrings(newPath);

shell.Exec('myprocess.exe'); // throws exception if not found

【讨论】:

    【解决方案2】:
    With WScript.CreateObject("WScript.Shell")
        .Environment("PROCESS")("PATH") = .ExpandEnvironmentStrings(Replace( _ 
            .Environment("USER")("PATH") & ";" & .Environment("SYSTEM")("PATH"), ";;", ";" _ 
        ))
    End With 
    

    这将使用从注册表中检索到的usersystem 环境变量的信息覆盖内存中的当前进程PATH 环境变量。

    注意:之前的代码只更新了执行代码的[c|w]script进程的环境副本。它不会更新安装程序的环境副本(您不能更新另一个进程环境)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 2017-11-16
      • 2017-03-06
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      • 2020-12-02
      相关资源
      最近更新 更多