|
本帖最后由 rgy 于 2017-7-31 22:33 编辑
想做一个单文件程序,想法是这样的:双击文件程序就开始安装,安装好后就自动运行,等软件使用完了退出程序后就自动卸载,最后在电脑上留下的痕迹越少越好。比如我想把USB Safely Remove这个程序做成单文件,具体过程我想的是这样:无界面运行-判断系统位数-根据系统位数解压相应文件到指定文件夹 -导入注册表-安装并运行软件服务-运行主程序-运行结束后 -停止删除软件服务-清除解压出来的文件-清理其它软件垃圾-清理注册表文件-最后完全退出.
下面是自己东拼西凑的代码,由于没有一点编程基础,所以是漏洞百出,高手看了你别笑,对于我来说能编译成功已经是个奇迹了!
希望懂的朋友看到帖子能给我提出一些修改建议,谢谢了。
- ;NSIS单文件打包模板20170731
- ;********************************************************************
- ;*定义变量
- ;********************************************************************
- !define APP "USBSafelyRemove" ; 程序主要名(不带空格)
- !define APPEXE "USBSafelyRemove.exe" ; 主程序文件EXE
- !define VER "6.0.8.1261" ; 版本号
- !define APPNAME "${APP}_${VER}" ;程序全名,带版本号
- !define APPDIR "$TEMP\${APP}" ;主程序解包路径
- !define /date DATE "%Y.%m.%d.%H" ;定义DATE为年.月.日.时
- !define TIMEVER "Build ${DATE}" ;定义TIMEVER为 Build 年月日时
- ;********************************************************************
- ;*基本信息
- ;********************************************************************
- Name "${APPNAME}" ;标题栏显示文字
- OutFile "${APPNAME}_自用版.exe" ;指定成品输出的路径和文件名
- Icon "${APP}.ico" ;设置程序的ico图标
- ;********************************************************************
- ;*常规属性设置
- ;********************************************************************
- ;设置为静默安装
- SilentInstall silent
- ;安装完成的时候窗口自动关闭
- AutoCloseWindow True
- ;加入x64头文件,后面判断系统位数会用到
- !include "x64.nsh"
- ;指定压缩方式/所有的数据将被压缩在一个区块里,这样可以提高压缩率。
- SetCompressor /SOLID lzma
- ;设置使用 LZMA 压缩器时的字典大小 (默认为 8MB)
- SetCompressorDictSize 32
- ;安装程序需要的执行级别none|user|highest|admin。设为默认值none将由Windows来判断执行级别,none和admin实际上具有相同效果。
- RequestExecutionLevel admin
- ;File命令文件是否覆盖。on全覆盖;off全不覆盖;try默认覆盖,覆盖不了的就略过;ifnewer只有旧文件被覆盖;ifdiff新旧不一的文件才被覆盖,且设为新文件的日期。
- SetOverwrite on
- ;********************************************************************
- ;*版本信息
- ;********************************************************************
- VIProductVersion "${DATE}" ;在文件属性版本表格的顶部添加产品版本号。
- VIAddVersionKey /LANG=2052 "FileDescription" "${APP}自用版" ;文件说明
- VIAddVersionKey /LANG=2052 "ProductName" "${APP}" ;产品名称
- VIAddVersionKey /LANG=2052 "ProductVersion" "${VER}" ;产品版本
- VIAddVersionKey /LANG=2052 "LegalCopyright" "" ;版权
- VIAddVersionKey /LANG=2052 "CompanyName" "" ;公司
- #VIAddVersionKey /LANG=2052 "OriginalFilename" "${APPNAME}_自用版.exe" ;原文件名
- VIAddVersionKey /LANG=2052 "FileVersion" "${TIMEVER}" ;版本号
- ;********************************************************************
- ;*运行
- ;********************************************************************
- Section "main" ;创建区段,名称为main
- ;----------------主程序运行前的准备工作-------------------
- SetOutPath "${APPDIR}" ;设置文件解压路径为$TEMP\USBSafelyRemove,且当路径不存在时创建
- File /a /r "${APP}\*" ;解压一个文件夹,同时也指定了该文件夹打包的来源路径
- ${If} ${RunningX64} ;判断系统是不是64位
- File /a /r "x64\*" ;如果使用了/a开关,则被添加的文件的属性将会保持。如果使用了/r开关,匹配的文件将会在子目录里被递归的搜索。
- SetRegView 64 ;设置由注册表操作命令影响的注册表方式为64位方式
- ${Else}
- File /a /r "x86\*"
- SetRegView 32
- ${EndIf}
- SetOutPath "$TEMP" ;解压路径设置到$TEMP,最后才能完全删除$TEMP\USBSafelyRemove文件夹
- ;写入USBSafelyRemove的注册表值
- WriteRegStr HKCU "Software\SafelyRemove" "LicKey" "Q1IHAQUAYWRtaW4AAGUAEKQAAAAAAADpj3VELsaS2C889XHjTP/K8qmZgaspZSk27KqFw4sOS5MBP2u475SK" ;注册码
- WriteRegStr HKCU "Software\SafelyRemove\Options" "CheckforUpdates" "0" ;关闭自动升级
- WriteRegStr HKCU "Software\SafelyRemove\Options" "LangFileName" "Chinese-Simplified" ;设置简体中文
- WriteRegStr HKCU "Software\SafelyRemove\Options" "RunWithWindows" "0" ;关闭开机自启动
- WriteRegStr HKCU "Software\SafelyRemove\Options" "SkinName" "Win8ModernUI" ;设置主题为Win8ModernUI
- nsExec::Exec '"$TEMP\USBSafelyRemove\USBSRService.exe" /install /silent' ;静默安装USBSafelyRemove的软件服务
- ;-------------------运行主程序----------------------
- Execwait "${APPDIR}\${APPEXE}" ;运行USBSafelyRemove.exe并且等待运行结束
- ;-----------主程序运行结束后的清理工作--------------
- nsExec::Exec '"$TEMP\USBSafelyRemove\USBSRService.exe" /uninstall /silent' ;删除USBSafelyRemove的软件服务
-
- RMDir /r /REBOOTOK "${APPDIR}" ;删除文件夹$TEMP\USBSafelyRemove
- SetShellVarContext current ;使用当前用户的命令解释程序目录
- RMDir /r /REBOOTOK "$APPDATA\USBSafelyRemove" ;删除C:\Users\Administrator\AppData\Roaming\USBSafelyRemove
- SetShellVarContext all ;使用所有用户的命令解释程序目录
- RMDir /r /REBOOTOK "$APPDATA\USBSRService" ;删除C:\ProgramData\USBSRService
- SetShellVarContext current ;设置回用当前用户的命令解释程序目录
- DeleteRegKey HKCU "Software\SafelyRemove" ;删除注册表HKEY_CURRENT_USER\Software\SafelyRemove
- DeleteRegKey HKLM "SOFTWARE\SafelyRemove" ;删除注册表HKEY_LOCAL_MACHINE\SOFTWARE\SafelyRemove
- ;获取S-1-5-21-XXXXXX键值
- System::Call `*(&t1024)i.R0`
- System::Call `advapi32::GetUserName(t.s,*i1024)`
- System::Call `advapi32::LookupAccountName(tn,ts,iR0,*i1024,tn,*i1024,*i)`
- System::Call `advapi32::ConvertSidToStringSid(iR0,*t.r0)`
- System::Free $R0
- DeleteRegKey HKU "$0\Software\SafelyRemove" ;删除注册表HKEY_USERS\S-1-5-21-xxxxxxxxxx\Software\SafelyRemove
- SectionEnd ;区段结束
- ;********************************************************************
- ;*函数部分
- ;********************************************************************
- ;创建互斥防止重复运行
- Function .onInit
- InitPluginsDir
- System::Call 'kernel32::CreateMutexA(i 0, i 0, t "USB.SRService") i .r1 ?e'
- Pop $R6
- StrCmp $R6 0 +3
- MessageBox MB_OK|MB_ICONEXCLAMATION "程序已在运行!"
- Abort
- FunctionEnd
复制代码
NSIS脚本编译简易教程:
USB Safely Remove 打包要用的全部文件:
USBSafelyRemove原始文件: http://pan.baidu.com/s/1i4I2mG1 密码:ge16
|
评分
-
查看全部评分
|