从宏内设置全局变量

时间:2012-05-03 06:20:39

标签: installer nsis

在NSIS脚本语言中,当我从宏中访问全局变量时,我收到错误。

我的变量installDirectory真的是全局的吗?如何在宏或函数内设置变量installDirectory(如果在函数中可能的话)?

var installDirectory

!macro IdentifyDir
   IfFileExists C:\test\9.00\ Version9 AbortInstall

   Version9:
      $installDirectory "C:\test\9.00\"
   AbortInstall:
      Abort
!macroend

Macro& /或函数也能在NSIS中返回一个值(或者我只是使用push / pop)吗?

!macro IdentifyDir
   IfFileExists C:\test\9.00\ Version9 AbortInstall

   Version9:
      return "C:\test\9.00\"
   AbortInstall:
      Abort
!macroend

var installDir !insertmacro IdentifyDir # is that valid?

1 个答案:

答案 0 :(得分:1)

有两个问题:

  • 分配一个变量,你错过了一个赋值指令;对于字符串变量,您可以使用StrCpyStrCpy $installDirectory "C:\test\9.00\"

  • your another question about labels中所述,标签不是sub,而只是流控制可以达到的某些定义点,因此当跳转到Version9标签时,如果没有其他跳转,执行将会执行运行到Abort标签后面的AbortInstall语句。您应该 end_of_macro:语句之前添加!macroEnd之类的其他标签,并在goto标签之前添加AbortInstall(请注意该宏扩展其中你放!insertMacro所以你必须选择一个唯一的标签名称,它不像部分或功能)(更优雅)反转两个标签:在中止的情况下,执行将在那里停止,在第二种情况下,它将继续在宏之外

!macro IdentifyDir 
    IfFileExists C:\temp\9.00 Version9 AbortInstall
AbortInstall:
    Abort
Version9:
    StrCpy $installDirectory "C:\test\9.00\"
!macroend

有关返回值的问题,您可以使用默认寄存器$0$9$R0$R9