无忧启动论坛

标题: 用NSIS制作单文件程序 [打印本页]

作者: rgy    时间: 2017-7-27 20:57
标题: 用NSIS制作单文件程序
本帖最后由 rgy 于 2017-7-31 22:33 编辑

       想做一个单文件程序,想法是这样的:双击文件程序就开始安装,安装好后就自动运行,等软件使用完了退出程序后就自动卸载,最后在电脑上留下的痕迹越少越好。比如我想把USB Safely Remove这个程序做成单文件,具体过程我想的是这样:无界面运行-判断系统位数-根据系统位数解压相应文件到指定文件夹 -导入注册表-安装并运行软件服务-运行主程序-运行结束后 -停止删除软件服务-清除解压出来的文件-清理其它软件垃圾-清理注册表文件-最后完全退出.
       下面是自己东拼西凑的代码,由于没有一点编程基础,所以是漏洞百出,高手看了你别笑,对于我来说能编译成功已经是个奇迹了!
       希望懂的朋友看到帖子能给我提出一些修改建议,谢谢了。


  1. ;NSIS单文件打包模板20170731
  2. ;********************************************************************
  3. ;*定义变量
  4. ;********************************************************************

  5. !define APP "USBSafelyRemove"            ; 程序主要名(不带空格)
  6. !define APPEXE "USBSafelyRemove.exe"     ; 主程序文件EXE
  7. !define VER "6.0.8.1261"                 ; 版本号

  8. !define APPNAME "${APP}_${VER}"          ;程序全名,带版本号
  9. !define APPDIR "$TEMP\${APP}"            ;主程序解包路径
  10. !define /date DATE "%Y.%m.%d.%H"         ;定义DATE为年.月.日.时
  11. !define TIMEVER "Build ${DATE}"          ;定义TIMEVER为 Build 年月日时

  12. ;********************************************************************
  13. ;*基本信息
  14. ;********************************************************************

  15. Name "${APPNAME}"                        ;标题栏显示文字
  16. OutFile "${APPNAME}_自用版.exe"          ;指定成品输出的路径和文件名
  17. Icon "${APP}.ico"                        ;设置程序的ico图标

  18. ;********************************************************************
  19. ;*常规属性设置
  20. ;********************************************************************

  21. ;设置为静默安装
  22. SilentInstall silent
  23. ;安装完成的时候窗口自动关闭
  24. AutoCloseWindow True
  25. ;加入x64头文件,后面判断系统位数会用到
  26. !include "x64.nsh"
  27. ;指定压缩方式/所有的数据将被压缩在一个区块里,这样可以提高压缩率。
  28. SetCompressor /SOLID lzma
  29. ;设置使用 LZMA 压缩器时的字典大小 (默认为 8MB)
  30. SetCompressorDictSize 32
  31. ;安装程序需要的执行级别none|user|highest|admin。设为默认值none将由Windows来判断执行级别,none和admin实际上具有相同效果。
  32. RequestExecutionLevel admin
  33. ;File命令文件是否覆盖。on全覆盖;off全不覆盖;try默认覆盖,覆盖不了的就略过;ifnewer只有旧文件被覆盖;ifdiff新旧不一的文件才被覆盖,且设为新文件的日期。
  34. SetOverwrite on

  35. ;********************************************************************
  36. ;*版本信息
  37. ;********************************************************************
  38. VIProductVersion "${DATE}"                                               ;在文件属性版本表格的顶部添加产品版本号。
  39. VIAddVersionKey /LANG=2052  "FileDescription" "${APP}自用版"             ;文件说明
  40. VIAddVersionKey /LANG=2052  "ProductName" "${APP}"                       ;产品名称
  41. VIAddVersionKey /LANG=2052  "ProductVersion" "${VER}"                    ;产品版本
  42. VIAddVersionKey /LANG=2052  "LegalCopyright" ""                          ;版权
  43. VIAddVersionKey /LANG=2052  "CompanyName" ""                             ;公司
  44. #VIAddVersionKey /LANG=2052  "OriginalFilename" "${APPNAME}_自用版.exe"  ;原文件名
  45. VIAddVersionKey /LANG=2052  "FileVersion" "${TIMEVER}"                   ;版本号

  46. ;********************************************************************
  47. ;*运行
  48. ;********************************************************************

  49. Section "main"                                                    ;创建区段,名称为main

  50. ;----------------主程序运行前的准备工作-------------------
  51.   SetOutPath "${APPDIR}"                                          ;设置文件解压路径为$TEMP\USBSafelyRemove,且当路径不存在时创建
  52.       File /a /r "${APP}\*"                                       ;解压一个文件夹,同时也指定了该文件夹打包的来源路径

  53. ${If} ${RunningX64}                                               ;判断系统是不是64位
  54.       File /a /r "x64\*"             ;如果使用了/a开关,则被添加的文件的属性将会保持。如果使用了/r开关,匹配的文件将会在子目录里被递归的搜索。
  55.       SetRegView 64                                               ;设置由注册表操作命令影响的注册表方式为64位方式
  56. ${Else}
  57.       File /a /r "x86\*"
  58.       SetRegView 32
  59. ${EndIf}

  60. SetOutPath "$TEMP"                                                ;解压路径设置到$TEMP,最后才能完全删除$TEMP\USBSafelyRemove文件夹

  61. ;写入USBSafelyRemove的注册表值
  62. WriteRegStr  HKCU "Software\SafelyRemove" "LicKey" "Q1IHAQUAYWRtaW4AAGUAEKQAAAAAAADpj3VELsaS2C889XHjTP/K8qmZgaspZSk27KqFw4sOS5MBP2u475SK" ;注册码
  63. WriteRegStr  HKCU "Software\SafelyRemove\Options" "CheckforUpdates" "0"                   ;关闭自动升级
  64. WriteRegStr  HKCU "Software\SafelyRemove\Options" "LangFileName" "Chinese-Simplified"     ;设置简体中文
  65. WriteRegStr  HKCU "Software\SafelyRemove\Options" "RunWithWindows" "0"                    ;关闭开机自启动
  66. WriteRegStr  HKCU "Software\SafelyRemove\Options" "SkinName" "Win8ModernUI"               ;设置主题为Win8ModernUI

  67. nsExec::Exec '"$TEMP\USBSafelyRemove\USBSRService.exe" /install /silent'        ;静默安装USBSafelyRemove的软件服务

  68. ;-------------------运行主程序----------------------
  69. Execwait "${APPDIR}\${APPEXE}"                                                  ;运行USBSafelyRemove.exe并且等待运行结束

  70. ;-----------主程序运行结束后的清理工作--------------

  71. nsExec::Exec '"$TEMP\USBSafelyRemove\USBSRService.exe" /uninstall /silent'      ;删除USBSafelyRemove的软件服务
  72.   
  73.     RMDir /r /REBOOTOK "${APPDIR}"                                              ;删除文件夹$TEMP\USBSafelyRemove
  74. SetShellVarContext current                                                      ;使用当前用户的命令解释程序目录
  75.     RMDir /r /REBOOTOK "$APPDATA\USBSafelyRemove"                               ;删除C:\Users\Administrator\AppData\Roaming\USBSafelyRemove
  76. SetShellVarContext all                                                          ;使用所有用户的命令解释程序目录
  77.     RMDir /r /REBOOTOK "$APPDATA\USBSRService"                                  ;删除C:\ProgramData\USBSRService
  78. SetShellVarContext current                                                      ;设置回用当前用户的命令解释程序目录

  79. DeleteRegKey  HKCU "Software\SafelyRemove"                                      ;删除注册表HKEY_CURRENT_USER\Software\SafelyRemove
  80. DeleteRegKey  HKLM "SOFTWARE\SafelyRemove"                                      ;删除注册表HKEY_LOCAL_MACHINE\SOFTWARE\SafelyRemove

  81. ;获取S-1-5-21-XXXXXX键值
  82. System::Call `*(&t1024)i.R0`
  83. System::Call `advapi32::GetUserName(t.s,*i1024)`
  84. System::Call `advapi32::LookupAccountName(tn,ts,iR0,*i1024,tn,*i1024,*i)`
  85. System::Call `advapi32::ConvertSidToStringSid(iR0,*t.r0)`
  86. System::Free $R0

  87. DeleteRegKey  HKU "$0\Software\SafelyRemove"                                    ;删除注册表HKEY_USERS\S-1-5-21-xxxxxxxxxx\Software\SafelyRemove

  88. SectionEnd                                                                      ;区段结束

  89. ;********************************************************************
  90. ;*函数部分
  91. ;********************************************************************
  92. ;创建互斥防止重复运行
  93. Function .onInit
  94. InitPluginsDir
  95.   System::Call 'kernel32::CreateMutexA(i 0, i 0, t "USB.SRService") i .r1 ?e'
  96.   Pop $R6
  97.   StrCmp $R6 0 +3
  98.     MessageBox MB_OK|MB_ICONEXCLAMATION "程序已在运行!"
  99.     Abort
  100. FunctionEnd

复制代码





NSIS脚本编译简易教程:





USB Safely Remove 打包要用的全部文件:

USBSafelyRemove原始文件: http://pan.baidu.com/s/1i4I2mG1 密码:ge16

USBSafelyRemove_模板:20170731.rar

2.59 KB, 下载次数: 102, 下载积分: 无忧币 -2

NSIS脚本

nsis-3.02-setup.7z

1.61 MB, 下载次数: 114, 下载积分: 无忧币 -2

NSIS 3.02安装包


作者: rgy    时间: 2017-7-27 21:35
本帖最后由 rgy 于 2017-7-31 22:48 编辑

这里有一个我打包的成品:

USBSafelyRemove_6.0.8.1261_自用版.part1.rar

1.8 MB, 下载次数: 86, 下载积分: 无忧币 -2

USBSafelyRemove_6.0.8.1261_自用版.part2.rar

1 MB, 下载次数: 85, 下载积分: 无忧币 -2


作者: liuzhaoyzz    时间: 2017-7-28 08:35
NSIS感觉需要懂脚本,用简单点的Smart Install Maker不行吗?
或者setup2go也行啊。

作者: lwz56    时间: 2017-7-28 08:48
本帖最后由 lwz56 于 2017-7-28 10:02 编辑

我参照官方安装包的安装方式重新写了下,成品及源码都在这里,你看看是否可以。
我在win7 64位测试没问题,别的系统没试。
链接:http://pan.baidu.com/s/1geHQeYZ 密码:30ai

作者: ql1307096    时间: 2017-7-28 08:51
使用nsis制作便携软件有点麻烦,涉及到监视进程,需要始终用一个进程来监测应用程序,发现程序关闭了,就删除临时的文件。可以研究下P.A.L便携软件制作。
如果仅仅是做一个单文件程序,我觉得使用Enigma Virtual Box更加方便些。
作者: lwz56    时间: 2017-7-28 09:47
我参照官方安装包的安装方式重新写了下,成品及源码都在这里,你看看是否可以。
我在win7 64位测试没问题,别的系统没试。
链接:http://pan.baidu.com/s/1geHQeYZ 密码:30ai
作者: 120268323    时间: 2017-7-28 12:02
论坛里不是有一个单文件制作软件吗?是解压到临时文件夹里的!
作者: rgy    时间: 2017-7-28 14:01
liuzhaoyzz 发表于 2017-7-28 08:35
NSIS感觉需要懂脚本,用简单点的Smart Install Maker不行吗?
或者setup2go也行啊。

这两个软件我都看了下,都不适合用来做我说的这种单文件程序吧。
作者: rgy    时间: 2017-7-28 14:47
lwz56 发表于 2017-7-28 08:48
我参照官方安装包的安装方式重新写了下,成品及源码都在这里,你看看是否可以。
我在win7 64位测试没问题 ...

谢谢帮助,我又学到了一种安装软件服务的方法了:
nsExec::Exec '"$TEMP\USBSafelyRemove\USBSRService.exe" /install /silent'
不过你改的脚本像是在做精简,后面清理部分的有些代码为什么要删除了呢?
删除了有些文件和注册表就不能被正确清除了吧!
作者: rgy    时间: 2017-7-28 15:08
ql1307096 发表于 2017-7-28 08:51
使用nsis制作便携软件有点麻烦,涉及到监视进程,需要始终用一个进程来监测应用程序,发现程序关闭了,就删 ...

一开始就是研究的P.A.L便携软件制作,发现他那一套也是够复杂的,找了些教程学了半天都是在备份用户配置、恢复用户配置什么的,然而我并不需要这一套。后来才弄明白,它本质就是一个NSIS代码生成器,那我为什么不直接写NSIS脚本呢,本来我想实现的功能就很简单直接。
作者: Neoland    时间: 2017-7-28 15:52
1,加个  SetAutoClose true
2,是区分64和32系统,SetRegView切换,HKLM的修改需要管理员,是否UAC开启,程序运行提请管理员权限运行。
作者: rgy    时间: 2017-7-28 22:07
Neoland 发表于 2017-7-28 15:52
1,加个  SetAutoClose true
2,是区分64和32系统,SetRegView切换,HKLM的修改需要管理员,是否UAC开启, ...

厉害了,看问题一针见血,第二个问题已经解决了,原来注册表操作还要分32位方式和64位方式啊。第一个问题原本就时有时无,现在一通修改后也没再出现了,应该也解决了吧!非常感谢你的帮助!
作者: lwz56    时间: 2017-7-30 17:25
本帖最后由 lwz56 于 2017-7-30 17:30 编辑
rgy 发表于 2017-7-28 14:47
谢谢帮助,我又学到了一种安装软件服务的方法了:
nsExec::Exec '"$TEMP%uSBSafelyRemove%uSBSRService. ...


注意:我给你的安装服务方法是和官方安装包一样的,是最稳定可靠的,你的用插件安装服务的方法不保证针对任何软件服务都能用。
精简也不影响的啊,你干嘛弄那么复杂,删除可以递归目录的,我把乱起八糟的都给去了。
作者: rgy    时间: 2017-7-30 20:54
lwz56 发表于 2017-7-30 17:25
注意:我给你的安装服务方法是和官方安装包一样的,是最稳定可靠的,你的用插件安装服务的方法不保证针 ...

原来是这样啊,我有点拨开云雾见天日的感觉,现在就等守得云开见月明了。非常感谢你的帮助!
作者: eastmz    时间: 2017-10-14 13:36
rgy 发表于 2017-7-27 21:35
这里有一个我打包的成品:

请问你这个单文件是用什么软件制作的?
作者: rgy    时间: 2017-10-14 13:44
eastmz 发表于 2017-10-14 13:36
请问你这个单文件是用什么软件制作的?

标题写得这么直白:用NSIS制作单文件程序

帖子里面还有例子有方法哦!
作者: devilma    时间: 2017-10-14 16:48
谢谢,收下了!
作者: l3429900    时间: 2017-10-14 17:40
教程好详细,谢谢
作者: papago    时间: 2017-10-22 13:39
单文件程序的制作
作者: pbgz    时间: 2018-2-26 23:53
lwz56 发表于 2017-7-28 09:47
我参照官方安装包的安装方式重新写了下,成品及源码都在这里,你看看是否可以。
我在win7 64位测试没问题 ...

兄弟 能在分享一下你打包的源码吗?
作者: lwjxp    时间: 2018-2-27 22:38
mark,学习一下
作者: hqhlwz    时间: 2018-3-1 10:59
ql1307096 发表于 2017-7-28 08:51
使用nsis制作便携软件有点麻烦,涉及到监视进程,需要始终用一个进程来监测应用程序,发现程序关闭了,就删 ...

Enigma Virtual Box 如何制作 X86与X64同一个单文件呢 请指教
作者: lwz56    时间: 2020-1-2 10:36
pbgz 发表于 2018-2-26 23:53
兄弟 能在分享一下你打包的源码吗?

NSIS单文件打包工具开源了
源码分享7天,7天后自动失效!
源码链接:
链接:https://pan.baidu.com/s/1sYCGrrx0r9X9jxvdTSXPZw
提取码:fsed
作者: bytzhh    时间: 2020-2-29 00:07
lwz56 发表于 2020-1-2 10:36
NSIS单文件打包工具开源了
源码分享7天,7天后自动失效!
源码链接:

您好,可以再次分享一下NSIS单文件打包工具源码嘛,谢谢了
作者: gs358906    时间: 2020-2-29 10:10
喜欢单文件的,希望有分享,软件绿色的。
作者: lwz56    时间: 2020-2-29 11:54
bytzhh 发表于 2020-2-29 00:07
您好,可以再次分享一下NSIS单文件打包工具源码嘛,谢谢了

私信给你了
作者: leaguer    时间: 2020-2-29 13:03
lwz56 发表于 2020-2-29 11:54
私信给你了

也想讨教一下您的源码?可以吗?

作者: leaguer    时间: 2020-2-29 18:47
本帖最后由 leaguer 于 2020-2-29 18:48 编辑
lwz56 发表于 2020-2-29 11:54
私信给你了

非常感谢您的回复与分享!附件收到了!没有短信回复权限,只有在这里回复了
作者: sunyong1987    时间: 2020-9-9 21:04
lwz56 发表于 2017-7-28 09:47
我参照官方安装包的安装方式重新写了下,成品及源码都在这里,你看看是否可以。
我在win7 64位测试没问题 ...

您好,可以再次分享一下NSIS单文件打包工具源码嘛,谢谢了
作者: sunyong1987    时间: 2020-9-9 21:10
lwz56 发表于 2020-1-2 10:36
NSIS单文件打包工具开源了
源码分享7天,7天后自动失效!
源码链接:

您好,可以再次分享一下NSIS单文件打包工具源码嘛,谢谢了
作者: 2010bjpubjut    时间: 2020-9-9 21:31
我也来学习下单文件制作
作者: 黑中见白    时间: 2020-9-9 21:33
vmwarethinapp
作者: rgy    时间: 2020-9-10 20:46
黑中见白 发表于 2020-9-9 21:33
vmwarethinapp

这个很不错,原来一直想打包个低版本的AutoCAD,不知道这个工具行不行。




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3