• NSIS学习笔记


    MessageBox MB_OK '$$0 is "$0"' ;$0是某个值
    ${If} $0 == 'some value'
      MessageBox MB_OK '$$0 is some value'
    ${ElseIf} $0 == 'some other value'
      MessageBox MB_OK '$$0 is some other value'
    ${Else}
      MessageBox MB_OK '$$0 is "$0"'
    ${EndIf}
    logiclib 就是使用${IF} 语句 ${while}循环

    IntOp
    用户变量输出

    outfile "xunh.exe"

    !include "logiclib.nsh"

    section
    StrCpy $R1 0
    ${While} $R1 < 5
      IntOp $R1 $R1 + 1
      DetailPrint $R1
    ${EndWhile}

    sectionend

    page license ;许可协议页面
    page components;安装的组件
    page directory ;安装的目录
    page instfiles ;选择的组件
    uninstpage uninstconfirm ;卸载确认页面
    uninstpage instfiles ;卸载

    使用在段里的指令和安装程序属性指令不一样,他们在用户电脑运行环境里执行。这些指令可以解压文件读取和写入注册表、INI文件或普通文件,创建目录,创建快捷方式和更多功能。你可以在 指令 找到更多。

    更多的基本用法说明 SetOutPath 告诉安装程序要把文件输出到哪里,和要解压哪些 文件。

    回调函数就相当与一个调用函数,在安装程序一开始就调用而已

    除了区段里的代码,还有一些在回调函数里的代码也会被执行,而且可能会在区段之前就执行了。比如 .onInit 回调函数就最先被执行,或者在页面显示过程中执行某些 页面回调函数。


    outfile "xunh.exe"

    !include "logiclib.nsh"

    section
    StrCpy $R1 0
    ${While} $R1 < 5
      IntOp $R1 $R1 + 1
      DetailPrint $R1
    ${EndWhile}

    sectionend
    Function .onInit
      MessageBox MB_YESNO "即将安装我的程序,要继续吗?" IDYES gogogo
        Abort
      gogogo:
    FunctionEnd

    条件判断或执行代码循环可以使用 StrCmp, IntCmp, IfErrors, Goto 和其它来实现

    使用MessageBoxes 或 DetailPrint 来显示变量内容,对所有变量使用 DumpState 插件来勾画总体大纲。


    定义符号可以通过 !define 定义或使用 /D 命令行切换。这些定义符号可以用于条件编译
    (通过 !ifdef 定义)或用于符号替换(一种格式简单的宏)。若要用它的值替换一个符号,
    请使用 ${符号} (如果没有定义符号,那么不会产生转换)。这个转换为 first-come-first-served,


    一个插件的调用像这样:

    DLL名::函数名 "参数1" "参数2" "参数3"

    InstallOptions 是一个受欢迎的插件,它允许你建立自定义的的页面,并与 NSIS 页面命令结合(看 页面)。 开始菜单插件 提供了一个可允许用户选择一个开始菜单目录的页面。这里还有许多不同用途的大量插件,查看 Docs 目录 里的帮助文件和例子。你也可以在线查找另外的插件: NSIS 维客.

    引号的作用是是可以包含‘”他们可以是单引号、双引号或向后的单引号。

    $INSTDIR 安装目录
    $OUTDIR当前输出路径
    $CMDLINE安装程序的命令行输入。
    $LANGUAGE


    下面这些都是常量


    当前使用的语言标识符
    $DESKTOP

    Windows 桌面目录(通常为 C:\Windows\Desktop 但是运行时会检测)。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。

    $EXEDIR

    安装程序运行时的位置。(从技术上来说你可以修改此变量,但并不是一个好方法)。

    $EXEFILE

    安装程序的名称。

    $EXEPATH

    安装程序运行时的完整路径。

    ${NSISDIR}

    包含 NSIS 安装目录的符号定义标记。常用于在你想调用在 NSIS 目录下的资源时,例如:图标、界面……

    $SYSDIR

    Windows 系统目录(通常为 C:\Windows\System 或 C:\WinNT\System32 但在运行时会检测)。

    $STARTMENU

    开始菜单目录(常用于添加一个开始菜单项,使用 CreateShortCut)。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。

    $SMPROGRAMS

    开始菜单程序目录(当你想定位 $STARTMENU\程序 时可以使用它)。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。

    $SMSTARTUP

    开始菜单程序/启动 目录。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。

    $ \r \n \t
    要显示

    必须使用下面的这个
    $

    转义,用来表示 $。

    $\r

    用来表示一个回车(\r)。

    $\n

    用来表示新的一行(\n)。

    $\t

    用来表示一个 Tab(\t)。


    在引号里面加入 "${sec2_id} 的名称:$\n$0"  $\n 表示新的一行,且不显示,去掉$将显示

    每个内建的页面都有三个回调函数。一个预置函数、一个显示创建函数和一个离开函数

    一个自定义的页面仅有两个回调函数,一个是必须的创建页面,另一个离开函数的作用就和内建页面的离开函数一样。

     Page
    custom [创建函数] [离开函数] [标题] [/ENABLECANCEL]
      或
    内置的页面类型 [预置函数] [显示函数] [离开函数] [/ENABLECANCEL]
    要添加一个安装程序页面,请看上面关于相对于自定义页面的内建页面和关于回调函数的段。

    内置的页面类型 :

    license - 许可协议页面
    components - 组件选择页面
    directory - 安装目录选择页面
    instfiles - 安装执行页面
    uninstConfirm - 卸载确认页面

    " "引号好像在NSIS里面没有用


     StrCpy $0 1
       MessageBox MB_OK '$0'  就显示1

     StrCpy $0 1
       MessageBox MB_OK '$0 is $0 ' 1 is 1

    学会了调试

    看到了

    一般函数名以 . 开头的(例如 ".Whatever")作为回调函数保留

    也就是说:以.开头的是回调函数

    SendMessage
    窗口句柄 消息 第一个消息参数 第二个消息参数 [用户变量(返回值)] [/TIMEOUT=毫秒]

    AddBrandingImage
    (left|right|top|bottom) (宽|高)
    AddBrandingImage left 0
    AddBrandingImage right 50
    AddBrandingImage top 20
    AddBrandingImage bottom 35
    AddBrandingImage left 100 5

    安装程序界面 ,默认为0

     页面选项

    下面的这个列表列出了某个页面类型受什么样的命令影响。除非特别提及,否则这些命令都可以在 PageEx 区块内外使用。如果在一个 PageEx 区块内部使用那么他们仅仅对由 PageEx 设置的当前页面产生影响,否则他们将被设为其他所有页面的默认值。

    许可页面

    LicenseText
    LicenseData
    LicenseForceSelection
    组件选择页面

    ComponentText
    目录选择页面

    DirText
    DirVar - 仅能在 PageEx 里使用。
    DirVerify
    卸载、安装记录页面

    DetailsButtonText
    CompletedText
    卸载确认页面

    DirVar - 仅能在 PageEx 里使用。
    UninstallText
    要设置页面标题请使用 Caption。

    Icon
    [路径\]图标文件.ico
    设置安装程序的图标。在图标文件里的每一个图标将会被包含在安装程序里

    icon 功能强大,输出的EXE文件图标和安装时用的图标都是它

    例如它:icon f:\tub\LD.ico


    $INSTDIR
    安装目录
    是安装变量

    $PROGRAMFILES是安装常量

    $language 是变量,英语是1033
                      繁体中文是1028
                      简体中文是2052

    WriteRegStr是写入注册表

    解决了注册表的问题
     WriteRegStr HKLM   software\loadmaster version "4.0"
     writeregstr HKLM   software\loadmaster path "$INSTDIR"

    $instdir 是变量,路径,解决。


    呵呵,又测试成功
    InstallDir $programfiles\Loadmaster1
    InstallDirRegKey HKLM Software\loadmaster path

    InstallDirRegKey 的作用是检测以前的安装路径

     LoadLanguageFile
    语言文件.nlf
    载入语言文件

    loadlanguagefile "D:\Program Files\NSIS\Contrib\Language files\SimpChinese.nlf"
    ;loadlanguagefile  "D:\Program Files\NSIS\Contrib\Language files\English.nlf"

    如果用;loadlanguagefile SimpChinese.nlf
    loadlanguagefile  English.nlf
    不知道缺少了哪个头文件     

    $LANGUAGE

    当前使用的语言标识符,是一个变量。

    使用loadlanguagefile对于的语言 ID将会被定义(例如: ${LANG_ENGLISH} 将会被定义为 1033)。

    检测语言,然后显示许可 功能已经完成
    LicenseLangString ln ${LANG_SIMPCHINESE} f:\cnlicence.txt
    LicenseLangString ln ${LANG_ENGLISH} f:\enlicence.txt
    LicenseLangString license ${LANG_TRADCHINESE} f:\tnlicence.txt
    LicenseData $(ln)

     Pop
    用户变量(输出)
    从堆栈里弹出一个字串到用户变量 $x。如果堆栈是空的,则会置一个错误标记。

    Push 1
    Push 2
    Exch
    Pop $0 # = 1

    弹出 1赋值给变量 $0

    学会了SWITCH 语句


    outfile "switch.exe"
    !include "LogicLib.nsh"
    page instfiles

    section
    StrCpy $0 "2"
    ${switch}  $0
    ${Case} 1
    SetOutPath "$programfiles"
    file "f:\tub\pic.bmp"

     ${Break}


    ${Case}  2
    SetOutPath "$programfiles"
    file "f:\tub\pic2.bmp"
     ${Break}

    ${EndSwitch}

    问:如何运行一个安装文件 .reg
    答:注:your.reg为文件名

    ExecWait "regedit.exe /s your.reg"
    问:如何运行一个安装文件 .inf
    答:注:skins.inf 为文件名

    ExecWait "RunDll32 advpack.dll,LaunchINFSection skins.inf,DefaultInstall"
    问:如何运行一个安装文件 .msi
    答:注:soapsdk.msi为文件名

    Execwait `msiexec /qn /i "soapsdk.msi"`
    问: 关联文件图标后,图标没变化。
    答: 刷新图标

    'System::Call shell32.dll::SHChangeNotify(l, l, i, i) v (0x08000000, 0, 0, 0)'
    问:安装窗体变窄了。
    答:

    SetFont /LANG=2052 "tahoma" 8
    原问题见帖子 http://www.dreams8.com/thread-3961-1-1.html
    问:如何运行一个批处理文件 .bat
    答:注:your.bat为文件名

    ExecWait "your.bat"
    不显示黑框框

    nsExec::Exec"your.bat"


    sectionend

    ReadRegDWORD
    用户变量(输出) 根键 子键 项
     ReadRegStr
    用户变量(输出) 根键 子键 项
    WriteRegBin
    根键 子键 项 值数据
    该命令将会写一个区块的二进制数据到注册表
     WriteRegStr
    根键 子键 项 值
    把字串写入注册表

    EnumRegKey
    用户变量(输出) 根键 子键 索引

     ReadRegStr  相得益彰呵呵,一个读变量名,一个读里面的内容
    ReadRegStr
    用户变量(输出) 根键 子键 项


    ClearErrors
    清除错误位标记。

    ExecShell " open" "http://nsis.sf.net/" 空了一格都运行错误

    ${NSD_CreateText} 0 13u 100% 12u 最后一个为高度


    FindWindow
    用户变量(窗口句柄输出) 窗口类名 [窗口标题] [父窗口句柄] [childafter]


     GetDlgItem
    用户变量(输出) 窗口句柄 控件ID

    Section -AdditionalIcons
    ${switch} $language
    ${Case} ${LANG_ENGLISH}
    ;  WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
      CreateDirectory "$SMPROGRAMS\LoadMaster"
      CreateShortCut "$SMPROGRAMS\LoadMaster\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
      CreateShortCut "$SMPROGRAMS\LoadMaster\Uninstall.lnk" "$INSTDIR\uninst.exe"
      ${Break}
    ${Case} ${SIMPCHINESE}
    ; WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
      CreateDirectory "$SMPROGRAMS\装箱大师企业版"
      CreateShortCut "$SMPROGRAMS\装箱大师企业版\装箱大师官方网站.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
      CreateShortCut "$SMPROGRAMS\装箱大师企业版\装箱大师企业版卸载.lnk" "$INSTDIR\uninst.exe"
      CreateShortCut "$SMPROGRAMS\装箱大师企业版\装箱大师企业版帮助文档.lnk" "$INSTDIR\Manual.chm"
    ${Break}
    ${Case} 1028
     CreateDirectory "$SMPROGRAMS\裝箱大師企業版"
      CreateShortCut "$SMPROGRAMS\裝箱大師企業版\裝箱大師官方網站.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
      CreateShortCut "$SMPROGRAMS\裝箱大師企業版\裝箱大師企業版卸載.lnk" "$INSTDIR\uninst.exe"
      CreateShortCut "$SMPROGRAMS\裝箱大師企業版\裝箱大師企業版幫助文檔.lnk" "$INSTDIR\Manual.chm"

    ${Break}

    ${EndSwitch}

    SectionEnd

    InstallDir $programfiles\LoadMaster
    InstallDirRegKey HKLM Software\loadmaster path

    检测安装程序以前的路径,如果有,则安装在以前的目录下

    SectionIn 如果指定 RO 作为一个参数,则该区段将被设为只读区段,

    SetBrandingImage
    [/IMGID=对话里的ID项] [/RESIZETOFIT] 位图.bmp

    如果指定了 /RESIZETOFIT 则图像会自动改变尺寸到图像控件的大小。

    Page license licenseImage
    Function licenseImage
    PAGE还可以这样用


    delete $SMPROGRAMS\LoadMaster
    删除不了,下面的这个可以

    RMDir "$SMPROGRAMS\LoadMaster"
    SetAutoClose true 自动关闭界面,
    如自动关闭卸载界面
    在section unistall

    delete ....
    setautoclose
    sentionend


    /nounload的作用

    当插件命令执行时 NSIS 将会解压所需的插件 DLL 文件到一个临时目录 ($PLUGINSDIR),把指定的参数全部压入(从右到左次序),然后执行 DLL 函数。如果指定了 /NOUNLOAD 选项则插件将不会卸载直到安装程序退出或下一次你使用该插件并不带 /NOUNLOAD 参数。需要注意的是最后一次调用该插件的时候必须不能有 /NOUNLOAD 否则插件将不能从 $PLUGINSDIR 里删除,而导致垃圾文件留在用户的机器里。


    查看安装程序内部的语言在
    D:\Program Files\NSIS\Contrib\Language files\simpchinese.nsh 文件夹


    v2.0.1.0
    怎样去掉V
    其实把它当作一个字符串,从第一个往后赋给一个新的变量
    StrCpy $R0 $0 "" 1
    intop $8 $r0 - 2

    System::Call "Kernel32::GetSystemDefaultLangID(v ..) i .s"
      Pop $3

    检测系统语言,用到上面这个DLL。system 是DLL,CALL是函数


    Push $0
       Push $1
       messagebox MB_OK "$language"
      System::Call "mscoree::GetCORVersion(w .r0, i ${NSIS_MAX_STRLEN}, *i) i .r1 ?u"
    ${if} $language = 2052
    StrCmp $0 "" 0 +4
    Messagebox MB_OK "安装程序检测到您计算机上没有安装.Net Framework 2.0,您必须先安装.Net Framework 2.0 或以上版本,才能安装运行本软件! "
    ExecShell "open" "http://www.microsoft.com/downloads/details.aspx?familyid=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&displaylang=zh-cn"
    abort
    ${endif}

    检测.net用到上面这个函数 $0就是版本号,返回值
    还可以用下面的方法,检测微软.net安装路径的注册表里面。

    读取索引号,读取里面的值
    在HKLM\software\microsoft\net framework set up 下面

    WriteINIStr
    INI文件 区段 项 值

    WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"

    RMDir
    [/r] [/REBOOTOK] 目录名
    删除指定的目录(完整路径)。没有 /r 参数时只有在目录为空时才会被删除

    RMDir  "$desktop\裝箱大師企業版4.0.lnk"  竟然删不掉
    该为delete 就可

    我的理解是 rmdir 删除的是目录
               delete 删除的是完整路径

    RMDir /r  "$INSTDIR\Media\*.*"

    $instdir 就是c:\programs\loadmaster4.0


    插入宏,有三种选择
    1.在
    D:\Program Files\NSIS\Contrib\Modern UI\system.nsh
    2.!include "MUI.nsh" 其实就是上面这种选择
    3.在
    !include "MUI2.nsh"

    SMSTARTUP

    开始菜单程序/启动 目录。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。

    $QUICKLAUNCH

    在 IE4 活动桌面及以上的快速启动目录。如果快速启动不可用,仅仅返回和 $TEMP 一样。

    !ifdef FULL
        !define PRODUCT_NAME `迅雷Ayu去广告版`
        !define EXEFN `迅雷_${PRODUCT_VERSION}_Full.exe`
    !else
        !define PRODUCT_NAME `迅雷Ayu去广告精简版`
        !define EXEFN `迅雷_${PRODUCT_VERSION}_Lite.exe`
    !endif


    ${if} $1 == ""
    DetailPrint '$(Associatedfiletypes) *.${ext} $(For) "${desc}"...'
    WriteRegStr HKCR "Back.${Project}\.${ext}" "" "_Blank_"
    ${Else}
    DetailPrint '$(Modifyfiletypes) *.${ext} $(For) "${desc}"...'
    ${EndIf}

    If|Unless..{ElseIf|ElseUnless}..[Else]..EndIf|EndUnless
    - 有条件的执行一个语句区块,取决于表达式。

    AndIf|AndUnless|OrIf|OrUnless
    - 给 If, Unless, ElseIf 和 ElseUnless 增加额外的条件语句。

    添加卸载信息到添加/删除面板
    WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Product" "DisplayName" "Application Name"

    基本用法:

    makensis.exe myscript.nsi
    安静模式:

    makensis.exe /V1 myscript.nsi

    命令行问题。。?

    LicenseText
    [文本 [按钮文本]]
    licensetext 请先阅读协议 我同意
    licenseforceselection  radiobuttons "我接受""我不接受"

    使用引号,参数可以不用空格,如上

    BGFont
    [字体名称 [字体高度 [字体宽度] [/ITALIC] [/UNDERLINE] [/STRIKE]]]  ?

    赋值表达式在哪?!define 不能对变量

    呵呵,又测试成功
    InstallDir $programfiles\Loadmaster1
    InstallDirRegKey HKLM Software\loadmaster path

    InstallDirRegKey 的作用是检测以前的安装路径

    载入语言文件

    loadlanguagefile "D:\Program Files\NSIS\Contrib\Language files\SimpChinese.nlf"
    ;loadlanguagefile  "D:\Program Files\NSIS\Contrib\Language files\English.nlf"

    如果用;loadlanguagefile SimpChinese.nlf
    loadlanguagefile  English.nlf
    不知道缺少了哪个头文件

    基本上你有 25 个寄存器(20 个常规用途,5 个特殊用途),和一个堆栈。只有20个啊。


    WriteINIStr 写入项值,有什么作用?
     WriteINIStr
    INI文件 区段 项 值

      StrCpy $8 "$SYSDIR\IniTest"
      WriteINIStr "$INSTDIR\test.ini"  "MySection" "Value1" $8

    !macro BIMAGE IMAGE PARMS
     Push $0
     GetTempFileName $0
     File /oname=$0 "${IMAGE}"
     SetBrandingImage ${PARMS} $0
     Delete $0
     Pop $0
    !macroend

    $0 有什么用,file ?

           

     

  • 相关阅读:
    GithubPlus+PicGo + Typora 一键式图床
    快速掌握Linux这篇文章就够了。
    跨行程序员Java进阶--基础语法
    Prometheus(普罗米修斯)
    【学习记录】Golang
    服务器Docker-Compose 安装 Anaconda
    Kubernetes集群部署
    Jenkins部署
    Harbor部署
    Docker、Docker-Compose的安装以及相关使用
  • 原文地址:https://www.cnblogs.com/bluewelkin/p/1307889.html
Copyright © 2020-2023  润新知