NSIS 常用小问题合集(论坛收集) #3

程序代码 程序代码
问: 我想让软件安装在windows2000以上的版本, 98,ME的不要.
        请问如何在安装的时候得到当前操作系统的信息,如果系统不符合要求,就退出安装程序.

答: ReadRegStr $0 HKLM "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion
        strcmp $0 "" 98 nt
        98:
          messagebox  MB_ICONINFORMATION|MB_OK "您使用的操作系统版本过低,无法安装,程序将退出!"
        quit
          nt:


程序代码 程序代码
问:我在做一系统补丁,作封装系统时用的,想完成后自动删除自己,以免留下垃圾文件,如何在结束时删除自己呢?

答:System::Call 'kernel32::GetModuleFileNameA(i 0, t .s, i ${NSIS_MAX_STRLEN}) i'
      Pop $0
      Delete /REBOOTOK $0


程序代码 程序代码
问:!define MUI_WELCOMEPAGE_TITLE "欢迎使用 ****升级向导"
      我想把第一个welcome界面的文字改变
    可是,这个定义的改变,是需要我判的,如果是升级,我才重定义文字
    我把这个!define是写再.OnInit里面的,可是没起作用啊

答:带 ! 的都是编译期指令,编译好之后就不能改了。
但是你自己追查一下就很容易发现 NSIS\Contrib\Modern UI\System.nsh 里的宏是怎么写的,查找 MUI_WELCOMEPAGE_TITLE 几次就会发现的,其实就是向 $PLUGINSDIR\ioSpecial.ini 里写了一个字串而已。


程序代码 程序代码
问:我想把安装结束后的“查看自述”改成欣赏音乐但不知道怎么修改代码。

答:!define MUI_FINISHPAGE_SHOWREADME_FUNCTION playmusic
      !define MUI_FINISHPAGE_SHOWREADME_TEXT 欣赏音乐
       …………
    Function playmusic
          ExecShell "open" "$INSTDIR\你的音乐文件"
      FunctionEnd


程序代码 程序代码
问:假如我想直接解压一个文件到一个指定的路径,如 d:\temp\aa\ 下,应如何写代码?

答:CreateDirectory "d:\temp\aa\"
      File /oname="$PLUGINSDIR\unrar.exe" "WinRAR的安装目录\unrar.exe"
      File /oname="$PLUGINSDIR\abc.rar" "要解压的文件"
      nsExec::Exec '"$PLUGINSDIR\unrar.exe" x "$PLUGINSDIR\abc.rar" "d:\temp\aa\"'


程序代码 程序代码
问:在向一个文件写入 ASCII 码时不能继续编译,脚本中不能有 ASCII 码。提示:“错误: 未终结的字符串解析在。。。”
答:字符串要以 " 开头,并以 " 结尾。
问:问题不在于“"”,而在于这个字符“”,这个字符只要在脚本中就不能编译。这个字符的二进制是:00011010  十进制:026  十六进制:1A
答:确实如此,那你用 IntFmt 吧,相当于 printf
        StrCpy $0 "1234"
        IntFmt $1 "%c" 0x1A
        StrCpy $0 "$0$16789"
        DetailPrint $0
问:终于写入成功了,我用: IntFmt $1 "%c" 032 得到了我想要的字符,但数字字串为什么不是 026 呢?不解。
答:十六进制啊,%c 表示转换为字符。


程序代码 程序代码
问:在NSIS中如何实现对操作系统的判断呢?

答:System::Call "Kernel32::GetVersion(v) i .s"
      Pop $0
      IntOp $1 $0 & 0xFF
      DetailPrint "Windows 主版本: $1"
      IntOp $1 $0 & 0xFFFF
      IntOp $1 $1 >> 8
      DetailPrint "Windows 次版本: $1"
      IntCmpU $0 0x80000000 0 nt
      DetailPrint "Windows 95/98/Me"
      Goto wend
      nt:
        DetailPrint "Windows NT/2000/XP"
      wend:


程序代码 程序代码
问:怎样才可以在安装过程中判断目标文件或目录是否存在?

答:Iffilexist "$PROGRAMFILES\123\ABC.EXE" 0 +3
      MessageBox MB_OK "存在"
      goto +2
      MessageBox MB_OK "不存在"


程序代码 程序代码
问:怎样才可以在安装过程中判断目标注册表的一个值或字段是否存在?

答:ClearErrors
      ReadRegstr $0 HKLM "SOFTWARE\Microsoft\Windows\CurrentVersion\Run" "ABC"
      IfErrors 0 +3
      MessageBox MB_OK "不存在"
      goto +2
      MessageBox MB_OK "存在"


程序代码 程序代码
问:如何获取代表当前系统盘根目录的盘符?

答:Strcpy $R1 $WINDIR 3


待续……


评论: 5 | 引用: 0 | 查看次数: 16524
  • 1
sgdmithril [2010-03-25 09:03 AM]
请问,nsDialog如何在页面显示后再弹出MessageBox?
写在构造函数中如果在Show前面则弹出在上一页面了,如果在show后则要切换页面才显示。都不是想要的效果。
有没有页面完全显示后能调用的回调函数可以使用?或者替代方法?

不知道怎么弄,还请不吝赐教!
xin [2009-07-12 11:22 AM]
MUI_FINISHPAGE_RUN exe_file
可以通过复选框决定是否运行的应用程序. 当文件名中有空格时, 你不需用引号将其括起来.

MUI_FINISHPAGE_RUN_TEXT text
显示在 "运行程序" 复选框旁的文本.

MUI_FINISHPAGE_RUN_PARAMETERS parameters
运行应用程序所需的参数. 不要在值中直接使用双引号 (用 $\").

MUI_FINISHPAGE_RUN_NOTCHECKED
默认不选中 '运行程序' 复选框.

MUI_FINISHPAGE_RUN_FUNCTION function_name
用调用一个函数替代执行一个应用程序 (定义 MUI_FINISHPAGE_RUN 而不用参数). 你可以用这个函数执行多个应用程序, 或者你可以更改此复选框的名称并用它做其它事情.

梦工厂 [2009-07-12 08:07 AM]
我想把安装结束后的“运行程序”改成安装另一个文件但不知道怎么修改代码。
xin [2006-12-20 01:04 AM]
留言板中已回复。
小小 [2006-12-11 02:01 PM]
请问一下,用nsis做的安装盘能带安装路径之类的参数运行吗?

我想用其他程序启动一个静默安装程序,安装路径由启动程序指定,能做到不?
  • 1
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 5000 字 | UBB代码 开启 | [img]标签 关闭