InstallShield无法读取PowerShell脚本预先设置的系统环境变量问题问询
问题成因
这是Windows系统的环境变量生效机制导致的:
- 每个Windows进程启动时,只会从父进程继承一份环境变量的快照,进程运行期间不会主动同步系统级环境变量的变更
- 你在PowerShell子进程中设置的是Machine级系统环境变量,只会写入系统注册表,不会更新已经运行的InstallShield主进程的本地环境变量缓存
- InstallShield自带的
GetEnvVar接口读取的是自身进程的缓存值,不是最新的系统值,所以当场读取会失败,只有重启InstallShield进程、重新加载系统环境变量后才能读到值,加延迟无法解决该问题。
可行解决方案
方案1:规避环境变量中转,直接捕获PowerShell输出
这是最稳妥的方案,不需要修改系统环境变量,避免全局污染:
修改PowerShell脚本,最后把两个版本号用分隔符(比如逗号)拼接输出:$fileversion1 = (Get-Command '<File1>').FileVersionInfo.FileVersion $fileversion2 = (Get-Command '<File2>').FileVersionInfo.FileVersion Write-Output "$fileversion1,$fileversion2"InstallShield调用PowerShell脚本时捕获标准输出,拆分后直接得到两个版本号,无需后续读环境变量的步骤。
方案2:直接读取注册表获取最新系统环境变量
Machine级环境变量实际存储在注册表路径HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment下,你可以放弃使用GetEnvVar接口,改用InstallShield的注册表读取函数直接读取对应键值,拿到的就是PowerShell刚写入的最新值。额外优化建议:你当前调用
Set-ExecutionPolicy bypass是修改全局的PowerShell执行策略,会改动用户系统配置,更安全的做法是调用脚本时临时指定执行策略,无需单独修改全局设置:__LaunchAppAndWait("powershell","-ExecutionPolicy Bypass -File .\\GetFileVersion.ps1");
内容的提问来源于stack exchange,提问作者Sproggit
相关产品推荐
相关产品推荐

