如何让这个功能在NSIS中真正起作用?

时间:2013-03-14 21:07:24

标签: nsis

我试图在我的NSIS安装程序中分解出我所拥有的代码片段。摘录如下:

nsExec::ExecToStack 'Dism.exe /Online /Enable-Feature /FeatureName:NetFx3'
Pop $0

${If} $0 != 0
   Pop $0
   Push ".NET 3.5 failed to install: $\n$0"
   Call DetailPrintTS
   StrCpy $Errors "$Errors Errors From .NET 3.5 install:$\n$0$\n$\n"
${EndIf}

所以我想把它想象成:

Function LoggedExec
   Pop $0
   Pop $1

   nsExec::ExecToStack $0
   Pop $0

   ${If} $0 != 0
      Pop $0
      Push "$1 failed to install: $\n$0"
      Call DetailPrintTS
      StrCpy $Errors "$Errors Errors From $1 install:$\n$0$\n$\n"
   ${EndIf}
FunctionEnd

然后按如下方式调用它:

Push 'Dism.exe /Online /Enable-Feature /FeatureName:NetFx3'
Push '.NET 3.5'
Call LoggedExec

请注意,DetailPrintTS是我制作的另一个功能,包括DetailPrint中的时间戳:

Function DetailPrintTS
   Pop $7

   ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6

   DetailPrint "$4:$5:$6 -- $7$\n"
FunctionEnd

1 个答案:

答案 0 :(得分:1)

请记住,Push / Pop正在堆叠(换句话说,一个生命:最后,先出)。

在您的代码段中,您似乎Pop LoggedExec中的参数与Push编辑的顺序相同。相反,如果您Push命令并在日志文本之后,则需要按相反的顺序Pop

Push 'Dism.exe /Online /Enable-Feature /FeatureName:NetFx3'
Push '.NET 3.5'
Call LoggedExec

;in LoggedExec
pop $1
pop $0