论坛首页
论坛首页 开发者论坛 PortableApps开发 我这个NSIS自解压单文件打包脚本有问题吗?

我这个NSIS自解压单文件打包脚本有问题吗?

讨论关于便携软件开发的技术与问题,包括PAL、NSIS、VMware ThinApp及其他。
RGYiii 投名入寨
投名入寨

帖子: 2
麻烦大神帮忙看下我这个NSIS自解压单文件打包脚本有问题吗?我这些代码都是百度拼凑出来的,并没有学过编程,希望大神讲详细一点。我只是想把一些软件打包成自解压单文件版,用的时候双击能用就行了。
代码: 全选
;CCleaner自解压单文件打包模板20171124

;********************************************************************
;*定义变量
;********************************************************************
!define APP "CCleaner"                    ; 程序主要名(不带空格)
!define VER "5.33.0.6162"                 ; 版本号

!define APPDIR "$TEMP\${APP}"          ;主程序解包路径
!define /date DATE "%Y.%m.%d.%H"       ;定义DATE为年.月.日.时
!define TIMEVER "Build ${DATE}"        ;定义TIMEVER为 Build 年月日时

;********************************************************************
;*基本信息
;********************************************************************
Caption "${APP}"                         ;标题栏显示文字
OutFile "${APP}_${VER}_自用版.exe"       ;指定成品输出的路径和文件名
Icon "${APP}.ico"                        ;设置程序的ico图标

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



;********************************************************************
;*版本信息
;********************************************************************
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" "${APP}_${VER}.exe"            ;原文件名
VIAddVersionKey /LANG=2052  "FileVersion" "${TIMEVER}"                         ;版本号

;********************************************************************
;*运行
;********************************************************************

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

;----------------主程序运行前的准备工作-------------------
  SetOutPath "${APPDIR}"                                          ;设置文件解压路径为$TEMP\CCleaner,且当路径不存在时创建
      File /a /r "${APP}\*"                                       ;解压一个文件夹,同时也指定了该文件夹打包的来源路径
    
;-------------------运行主程序----------------------
${If} ${RunningX64}                                               ;判断系统是不是64位
Execwait "${APPDIR}\CCleaner64.exe"                               ;如果当前系统是64位就运行CCleaner64.exe并且等待运行结束
${Else}
Execwait "${APPDIR}\CCleaner.exe"                                 ;反之则运行CCleaner.exe并且等待运行结束
${EndIf}


;-----------主程序运行结束后的清理工作--------------
SetOutPath "$TEMP"                                                ;解压路径设置到$TEMP,最后才能完全删除$TEMP\CCleaner文件夹

    RMDir /r /REBOOTOK "${APPDIR}"                                ;删除文件夹$TEMP\CCleaner

SectionEnd                                                        ;区段结束



还有一个

代码: 全选
;USBSafelyRemove单文件打包模板20171124
;********************************************************************
;*定义变量
;********************************************************************

!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 年月日时

;********************************************************************
;*基本信息
;********************************************************************

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

;********************************************************************
;*常规属性设置
;********************************************************************

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



Caption "${APP}" ;设置安装程序标题条文本

;********************************************************************
;*版本信息
;********************************************************************
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

jooseng 革命同志
革命同志

帖子: 3650
NSIS 问题去这里吧:
http://www.nsisfans.com/

RGYiii 投名入寨
投名入寨

帖子: 2
jooseng 写道:
NSIS 问题去这里吧:
http://www.nsisfans.com/


这就尴尬了,我在那个论坛提过问,然而并没有人理我!

我又一路问到这里......


回到 PortableApps开发