技术vs艺术

技术是扎实的基本功,艺术是丰富的想象力;技术的突破总是从夸张的想像中开始的。

博客园 首页 新随笔 联系 订阅 管理

http://www.cnblogs.com/bluewelkin/

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 ?

posted on 2009-05-24 15:27  邓春光  阅读(1000)  评论(0编辑  收藏  举报