1

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

我的变量 installDirectory 真的是全球性的吗?如何从宏或函数中设置变量 installDirectory(如果它可能在函数中)?

var installDirectory

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

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

宏和/或函数也可以在 NSIS 中返回一个值(或者我只使用 push/pop 的 shd)吗?

!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?
4

1 回答 1

1

有两个问题:

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

  • 正如您关于标签的另一个问题所述,标签不是子标签,而只是流控制可以到达的一些定义点,因此当跳转到Version9标签时,如果没有另一个跳转,执行将运行到标签后面的Abort语句AbortInstall。您应该在语句之前放置另一个标签并在标签之前添加一个请注意,宏您放置的位置展开,因此您必须选择一个唯一的标签名称,这与部分或函数不同)end_of_macro:!macroEndgotoAbortInstall!insertMacro(更优雅)反转两个标签:在中止的情况下,执行将在那里停止,在第二种情况下,它将在宏之外继续

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

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

于 2012-05-03T08:44:19.750 回答