递归搜索目录中的sql文件(NSIS)

时间:2017-02-09 09:14:30

标签: nsis

我遇到了递归搜索的问题,但首先是一些关键数据:

  • 我有几个目录,里面填写了我要复制到$ TEMP
  • 的sql文件
  • 我想要阅读的目录看起来像这个v2.1.0.0
  • 目前,必须阅读目录v2.5.0.0至v2.7.0.3
  • 文件夹不必是“下一个”,所以v2.5.0.3可以跟随v2.5.0.0
  • 我正在使用LogicLib
  • 我是这种语言的新手(在java之前),这是我的第一个任务

我正在尝试用$ {ForEach}

来解决问题
!macro GetSQLVersionFiles first second third fourth
SetOutPath $TEMP
${ForEach} ${first} 0 9 + 1
    ${ForEach} ${second} 0 9 + 1
        ${ForEach} ${third} 0 9 + 1
            ${ForEach} ${fourth} 0 9 + 1
            IfFileExists "scripte\v${first}.${second}.${third}.${fourth}" 0 +2
            File "scripte\v${first}.${second}.${third}.${fourth}\*.sql"
            ${next}
        ${next}
    ${next}
${next}
!macroend

所以我的想法是,为了让它以后可行,有一个带有4个参数的宏,其中一个可以放置起始目录,比如所需的“2 5 0 0”,它遍历每个文件夹并放置找到的.sql文件进入$ TEMP目录

我已经尝试过的事情

  • 在没有{}
  • 的情况下参考所有参数
  • 写“$ {first} $ {first} 9 + 1(认为这只会从第一次迭代到9次)

我得到的错误是

!insertmacro: _ForEach
Usage: StrCpy $(user_var: output) str [maxlen] [startoffset]
Error in macro _ForEach on macroline 3
Error in macro GetSQLVersionFiles on macroline 2
Error in script "\\NAMEOFMYSCRIPT -- aborting creation process

LogicLib的_ForEach中的第三行是

StrCpy "${_v}" "${_f}"                                ; Assign the initial value

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:2)

您正在混合定义和变量。

使用!define创建定义,并使用${name}进行访问。

使用Var创建变量,并使用$name进行访问。您还可以使用一些内置变量:$ 0 .. $ 9.

变量可以在运行时更改,定义不能。

另一个问题是您无法使用File指令复制最终用户计算机上的文件,如果要在运行时复制文件,则需要使用CopyFiles指令。另一方面,如果你想从安装程序中提取文件(我无法根据你的问题告诉你想要哪个),那么你确实需要使用File指令,但是你不能使用${For},因为它是一个运行时的概念。您可以!system使用!includeexecute a batch file that builds a list of files in a .nsh,然后req.body