【问题标题】:Simple NSIS recipe for basic installation用于基本安装的简单 NSIS 配方
【发布时间】:2012-05-28 13:39:05
【问题描述】:

我正准备为我正在开发的游戏开发我的第一个 Windows 安装程序。我听说过 NSIS 推荐,但我的需求是基本的,我无法弄清楚到底需要什么。

我想要一个简短的 NSIS 脚本,它可以在“Program Files”目录中安装文件目录(必要时请求权限),在“开始”菜单中创建一个简单的快捷方式,并在“添加/删除”中注册卸载程序程序控制面板。

卸载程序只会删除目录并删除快捷方式,如果文件正在使用则提示重新启动。

最后,我想通过卸载所有旧文件并安装新文件来支持升级,如果旧文件正在使用,则会提示用户重新启动。

我在网上看到了一些示例 NSH 脚本,它们可以做一些这样的事情;我正在尝试自己将它吊在一起,看起来它将有数百行长。我的代码闻起来像是错误的东西。

我描述的程序真的应该是数百行 NSH 吗?肯定有更简单的方法吗?

【问题讨论】:

  • 你试过什么? NSIS 代码 有一百多行。它是一种和其他任何编程语言一样的编程语言。
  • 仅供参考,我正在考虑将 NSIS 关闭到 InnoSetup。有一个 B 计划总是好的。但我不会接受“切换到 InnoSetup!”或“只需使用 WiX!”作为这个问题的答案。世界需要这个 NSIS 问题得到明确和权威的回答。
  • NSIS 没有任何问题,“切换到 InnoSetup”是错误的答案。 NSIS实际上更强大。我的意思是,您问的不是真正的问题,而是“有人给我代码”。我记得当我编写我的第一个 NSIS 脚本时,我只花了几个小时就完成了您列出的所有功能,然后包括测试。

标签: windows installation nsis


【解决方案1】:

Download Eclipse 然后将EclipseNSIS plugin 安装到 Eclipse 中。这不仅为您提供了一个功能齐全的 NSIS 文件编辑器(具有代码完成等功能),而且还提供了一个向导来为您创建脚本,只需回答一些问题(应用程序标题、图标要使用,...)。

【讨论】:

  • 这就是我要找的。​​span>
【解决方案2】:

这应该很接近(我没有测试这个脚本)你应该填写空白并替换某些字符串...

!define Name "Foo"
Name "${Name}"
Outfile "${Name} setup.exe"
RequestExecutionLevel admin ;Require admin rights on NT6+ (When UAC is turned on)
InstallDir "$ProgramFiles\${Name}"

!include LogicLib.nsh
!include MUI.nsh

Function .onInit
SetShellVarContext all
UserInfo::GetAccountType
pop $0
${If} $0 != "admin" ;Require admin rights on NT4+
    MessageBox mb_iconstop "Administrator rights required!"
    SetErrorLevel 740 ;ERROR_ELEVATION_REQUIRED
    Quit
${EndIf}
FunctionEnd

!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "English"


Section
SetOutPath "$INSTDIR"
WriteUninstaller "$INSTDIR\Uninstall.exe"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Foo By Bar Inc."   "DisplayName" "${Name}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Foo By Bar Inc."   "UninstallString" "$INSTDIR\Uninstall.exe"
;TODO: Install your files with the File command
CreateShortCut "$SMPROGRAMS\${Name}.lnk" "$INSTDIR\Foo.exe"
SectionEnd

Section "Uninstall"
;TODO: Delete your files
Delete "$SMPROGRAMS\${Name}.lnk"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Foo By Bar Inc."
Delete "$INSTDIR\Uninstall.exe"
RMDir "$INSTDIR"
SectionEnd

【讨论】:

  • 这不会像我希望的那样在重启时替换正在使用的文件,但这是一个很好的开始。
  • 我错过/忘记了问题的重启部分,抱歉。 (并且在没有测试的情况下在 SO 编辑框中编码复杂的东西可能也不是一个好主意......)
【解决方案3】:

HM NIS Edit 是 NSIS 的一个很好的向导,它可以指导您完成您的第一个安装程序,包括您在上面提到的我相信的内容。

http://hmne.sourceforge.net/

如果您想在 NSIS 中提供更新程序,我建议您做一些事情:

  1. 为您的应用程序创建一种检查服务器更新的方法,通常在首次加载时完成
  2. 下载新的安装程序并运行它(从您的应用程序,尽管任何人都可能也可以从您的网站获取它)。
  3. 如果您的旧程序正在运行,您需要将其关闭。 NSIS 有插件可以找到一个进程并杀死它。这不是超级“好”,但可能是必要的。

I recommend this process plugin

如果您正在使用 DLL,您不能只删除它们。但是,在 NSIS 中,您可以重命名它们,然后在下次重新启动时将它们标记为删除,如下所示:

Delete /REBOOTOK file.txt

然后将新的 DLL 复制到文件夹中。

对于 NSIS,有大量的插件、示例和很大的帮助,但是学习该语言需要一点时间。 Inno 更容易学习,但当你了解细节时更难定制。不过,我会说两者总体上是可比的,并且两者都应该可以正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多