从NSIS脚本检测最后一次系统重启



正如标题所示,这是关于检查最后一次系统重启时间并根据该时间执行一些任务。

我的情况是,在安装过程中,我会要求用户在某些情况下重启系统。现在点击"OK"安装程序将被关闭,用户将不得不手动重启系统。

现在说,用户运行安装程序而不重新启动系统。现在安装程序应该报告一个错误并要求重新启动。

目前为止可能的解决方案。

  1. 检查和存储系统时间,并对两者进行比较。如果用户在长时间重启系统后运行安装程序,此方法将失败。
  2. 在RunOnce注册表中设置一些无效的值(只需要值的名称),并在安装程序启动时检查该值。由于RunOnce中的值会被Windows自动删除,如果安装程序发现该条目在那里,则很明显用户没有重新启动系统。

有更好的主意吗?

RunOnce键只适用于管理员,所以你必须记住这一点。

您可以查看系统已经运行了多长时间:

System::Call 'kernel32::GetTickCount64()l.r0'
StrCmp $0 error 0 +2
System::Call 'kernel32::GetTickCount()i.r0'

$0将包含自上次启动以来的毫秒数。(GetTickCount64是Vista+和更旧的系统将在大约45天后滚动到0)

.onInit中,您从注册表中读取前一个值(如果有的话)并进行比较,如果当前值大于前一个值,则系统没有重新启动。

另一种选择是将值写入(唯一的)易失性注册表项,这些键只存在于内存中,并且在重新启动时丢失:

!include WinCore.nsh
!include LogicLib.nsh
!ifndef REG_OPTION_VOLATILE
!define REG_OPTION_VOLATILE 1
!endif
System::Call 'advapi32::RegCreateKeyEx(i ${HKEY_LOCAL_MACHINE}, t "SoftwareVolatile{f255ae7a-fd7d-11e4-a322-1697f925ec7b}", i0, i0, i ${REG_OPTION_VOLATILE}, i ${GENERIC_WRITE}, i0, *i.r1, *i)i.r0'
${If} $0 = 0
        System::Call 'advapi32::RegCloseKey(ir1)'
        WriteRegDWORD HKLM "SoftwareVolatile{f255ae7a-fd7d-11e4-a322-1697f925ec7b}" NoReboot 1
${EndIf}

Windows 95/98/ME不支持Volatile key

最新更新