对于以下脚本:
!define API_LOCAL_SETUP_LOCATION "C:\Temp\Some.exe"
Function API_CHECK
!system 'for %a in (${API_LOCAL_SETUP_LOCATION}) do setx x1 "%~ta"'
!if "$%x1%" == "${U+24}%x1%"
!echo "%x1% not set"
!else
!echo "IS SET!"
!endif
FunctionEnd
这个想法是在
编译时检查“C:\Temp\Some.exe”文件的“修改日期”文件并将该值存储在
x1
环境变量中。
在编译 NSIS 脚本之前,如果我在命令提示符中执行
set
,则不存在 x1
环境变量(即未列出)。
如果我编译 NSIS 脚本,编译器会记录以下内容:
...
!define: "API_LOCAL_SETUP_LOCATION"="C:\Temp\Some.exe"
Function: "API_CHECK"
!system: "for %a in (C:\Temp\Some.exe) do setx x1 "%~ta""
C:\Users\User\Documents\Project\Installer>setx x1 "02/16/2024 01:10 PM"
SUCCESS: Specified value was saved.
!system: returned 0
%x1% not set (Configuration.nsh:39)
但是,如果我打开一个新的命令提示符窗口并执行
set
命令,则 x1
环境变量存在并分配给“02/16/2024 01:10 PM”,如下所示: x1=02/16/2024 01:10 PM
那么,为什么我在编译时无法读取
x1
环境变量?
注意:我试图避免将环境变量设置为系统变量(即
setx /m
)。
现有进程不会获取更改的环境变量,只有资源管理器会获取。从资源管理器启动的新进程将具有新变量。
使用
!system
+!include
技巧在编译时将某些内容放入 NSIS 中:
!define API_LOCAL_SETUP_LOCATION "$%windir%\Explorer.exe"
!tempfile TMPINC
!system 'for %a in (${API_LOCAL_SETUP_LOCATION}) do @echo !define MYDATE "%~ta" >"${TMPINC}"'
!include "${TMPINC}"
!delfile "${TMPINC}"
!error "The date is ${MYDATE}"