Installshield 未正确读取 PowerShell 脚本之前设置的环境变量

Posted

技术标签:

【中文标题】Installshield 未正确读取 PowerShell 脚本之前设置的环境变量【英文标题】:Installshield is not correctly reading an Environment Variable set earlier by a PowerShell script 【发布时间】:2021-10-14 00:53:32 【问题描述】:

我正在从 InstallShield 调用 PowerShell 脚本 - 该脚本设置了两个环境变量,每个变量都包含已安装文件的文件版本

PS 脚本包含

$fileversion1 = (Get-Command '<File1>').FileVersionInfo.FileVersion
[Environment]::SetEnvironmentVariable("File_Version_Installed_VCS",$fileversion1,"Machine")
$fileversion2 = (Get-Command '<File2>').FileVersionInfo.FileVersion
[Environment]::SetEnvironmentVariable("File_Version_Installing_VCS",$fileversion2,"Machine")

它是通过Installshield脚本调用的

My_AddToLog("Start - set up execution permissions for PowerShell Scripts");

__LaunchAppAndWait("powershell"," Set-ExecutionPolicy bypass"); 

: // Other lines of code, then later

 __LaunchAppAndWait("powershell",".\\GetFileVersion.ps1"); 

: // Other lines of code, then later

    if !(GetEnvVar("File_Version_Installed_VCS",sv_Installed_VCS_version ) < 0) then
       if !(GetEnvVar("File_Version_Installing_VCS",sv_Installing_VCS_version) < 0) then
          nvResult = StrCompare (sv_Installing_VCS_version,sv_Installed_VCS_version);
          :// other lines of code
       else
         My_AddToLog("File_Version_Installing_VCS envar not defined - cannot compare versions. Do 
         not overwrite Installed VCS version");
     else
         My_AddToLog("File_Version_Installed_VCS envar not defined - cannot compare versions. Do 
         not overwrite Installed VCS version");
     endif;

第一次运行程序时,我通过日志文件验证了这些环境变量是由 PS1 脚本设置的(之前也检查过 Envars 以前不存在),并且这是在稍后检查之前完成的环境变量上就搞定了。查看日志文件输出

8-10-2021 12:41:18 - Start - set up execution permissions for PowerShell Scripts
8-10-2021 12:41:18 -  Executing Command powershell  Set-ExecutionPolicy bypass
8-10-2021 12:41:27 -  Command SUCCESS 
:
8-10-2021 12:54:10 -  Executing Command powershell .\GetFileVersion.ps1
8-10-2021 12:54:20 - Waiting for Command to Complete 
8-10-2021 12:54:27 -  Command SUCCESS 
:

而且我还检查了这个时候(大约)设置了 envars 但后来

8-10-2021 12:56:06 - File_Version_Installed_VCS envar 未定义 - 无法比较版本。不要覆盖已安装的 VCS 版本

但是,在程序终止后,当我再次运行程序时,这一次会正确检测到 envar(使用上次运行时设置的值)。 所以这看起来是一个时间问题 - installshield GetEnvVar 调用似乎无法检测到环境变量,即使它们之前设置了大约 1.5 秒。我已经尝试在 envars 的设置和随后的读取它们之间增加进一步的延迟,但这没有区别。我相信 GetEnvVar 将不得不打开一个 CMD 窗口来读取环境变量,并且不知何故这无法读取先前设置的值 - 这只能在启动新程序运行时工作。 任何关于如何克服这一点的想法将不胜感激。提前致谢。

【问题讨论】:

我的 PowerShell 脚本的内容未正确显示。他们是 行是 $fileversion1 = (Get-Command "file1").FileVersionInfo.FileVersion [Environment]::SetEnvironmentVariable("File_Version_Installed_VCS",$fileversion1,"Machine") 【参考方案1】:

$fileversion1 = (Get-Command '').FileVersionInfo.FileVersion [System.Environment]::SetEnvironmentVariable("File_Version_Installed_VCS",$fileversion1,[System.EnvironmentVariableTarget]::Machine) $fileversion2 = (Get-Command '').FileVersionInfo.FileVersion [System.Environment]::SetEnvironmentVariable("File_Version_Installing_VCS",$fileversion2,[System.EnvironmentVariableTarget]::Machine)

【讨论】:

以上是关于Installshield 未正确读取 PowerShell 脚本之前设置的环境变量的主要内容,如果未能解决你的问题,请参考以下文章

MSI 未卸载 .dll 文件

Installshield2015 定制安装在C:Program files 目录 不正确问题

为啥 InstallShield 向导不显示上次卸载页面?

的InstallShield:达尔文描述

自定义操作中的第三方 exe - installshield

未正确读取 JSON 文件