NSIS编译时无法读取Setx设置的环境变量问题
NSIS编译时Setx设置环境变量无法即时读取的问题解决
问题原因
你遇到的核心问题是setx的工作机制导致的:
setx仅负责永久修改用户或系统级环境变量,它只会把变量值写入注册表对应项,不会将变量注入到当前运行的进程(也就是NSIS编译器所在的命令行进程)中。只有新启动的进程才会加载更新后的环境变量,所以编译时NSIS进程看不到刚设置的x1。- 你通过
!system执行的setx命令是在临时子CMD进程中运行的,修改的是注册表,当前NSIS编译进程的环境块不会自动刷新,自然检测不到变量。
解决方法(无需setx /m)
既然需求是在编译时获取文件修改时间并在NSIS脚本中使用,完全不需要用setx,直接捕获命令输出到NSIS预定义变量即可:
方法1:通过临时文件中转
!define API_LOCAL_SETUP_LOCATION "C:\Temp\Some.exe" Function API_CHECK ; 将文件修改时间输出到临时文件 !system 'for %a in (${API_LOCAL_SETUP_LOCATION}) do echo "%~ta"' > "$%TEMP%\tmp_modtime.txt" ; 从临时文件读取内容到NSIS定义x1 !define /file x1 "$%TEMP%\tmp_modtime.txt" ; 删除临时文件 !delfile "$%TEMP%\tmp_modtime.txt" !if "${x1}" == "" !echo "x1 not set" !else !echo "IS SET! ${x1}" !endif FunctionEnd
方法2:直接捕获命令输出(部分NSIS版本支持)
如果你的NSIS版本支持!system输出直接赋值给定义,可以用更简洁的写法:
!define API_LOCAL_SETUP_LOCATION "C:\Temp\Some.exe" Function API_CHECK ; 直接将for命令的输出捕获到x1定义中 !system 'for %a in (${API_LOCAL_SETUP_LOCATION}) do echo "%~ta"' | !define x1 !if "${x1}" == "" !echo "x1 not set" !else !echo "IS SET! ${x1}" !endif FunctionEnd
这两种方法都绕开了setx,直接在编译阶段获取到文件修改时间并存入NSIS的预定义变量,完全满足需求,也不需要修改系统级环境变量。
内容的提问来源于stack exchange,提问作者Dash
相关产品推荐
相关产品推荐

