从NSIS脚本

时间:2015-05-18 13:45:53

标签: windows nsis

好吧,正如标题所暗示的,它是关于检查最后一次系统重启时间并依赖于此,执行某些任务。

我的情况是,我会要求用户在安装过程中在某些条件下重启系统。现在点击'确定'安装程序将关闭,用户必须手动重启系统。

现在说,用户在不重新启动系统的情况下运行安装程序。现在,安装程序应报告错误并要求重新启动。

到目前为止可能的解决方法。

  1. 检查并存储系统时间并比较它们。如果用户在长时间系统重启后运行安装程序,则此方法将失败。
  2. 在注册表RunOnce中设置一些无效值(仅需要值名称),并在安装程序启动时检查该值。由于RunOnce的值会被Windows自动删除,如果安装程序发现该条目存在,显然用户没有重新启动系统。
  3. 有更好的想法吗?

1 个答案:

答案 0 :(得分:1)

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 "Software\Volatile\{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 "Software\Volatile\{f255ae7a-fd7d-11e4-a322-1697f925ec7b}" NoReboot 1
${EndIf}

Windows 95/98 / ME不支持易失密钥。

相关问题