【问题标题】:Getting folder name in NSIS at compile time在编译时在 NSIS 中获取文件夹名称
【发布时间】:2018-06-22 22:37:21
【问题描述】:

我想根据构建文件的文件夹动态命名我的 EXE 文件。因此,换句话说,如果我的 NSIS 脚本位于 C:\[blah]\MyProjectDir\Nullsoft\ 并且我的项目位于 C:\[blah]\MyProjectDir\MyProject\ 中,则输出 NSIS 可执行文件应该是 MyProjectDir.exe。为了简单起见,我显然混淆了名称,文件夹的结构对我们的团队具有实际意义。

基本上我们的(已经写好的,很久以前的)NSIS 脚本看起来像这样:

!define APP_NAME "OurGUI"
!define PROJ_NAME "OurGUI"
!define PATH_TO_FILES ..\${PROJ_NAME}\bin\Debug
!define EXEC_NAME "OurGUI.exe"
OutFile "GUI_Setup.exe"

还有很多东西可以处理注册表项、安装等...这是与我的问题相关的重要部分(因为我不想修改脚本的其余部分)。

我想改成这样的

!define M_NUMBER !system "for %I in (..) do echo %~nxI"

!define APP_NAME "${M_NUMBER}/ Demo GUI"
!define PROJ_NAME "OurGUI"
!define PATH_TO_FILES ..\${PROJ_NAME}\bin\Debug
!define EXEC_NAME "M_Number.exe"
OutFile "${M_NUMBER}_GUI_Setup.exe"

我知道我的语法完全不对,但就是这样。

运行命令for %I in (..) do echo %~nxI 会返回祖父目录的名称,这正是我想要的。现在我需要弄清楚如何将它存储在某种变量中,以便可以在!define 中使用它。我需要在我的 NSIS 脚本中以某种方式将输出捕获到控制台(而不是 for 的返回值,它始终为零,在我的 NSIS 脚本中。理想情况下,我不必使用外部插件,因为这将是一场噩梦团队。

作为一个不错的奖励,我还希望能够操作字符串(同样,在编译时,它可以在!define 中使用。

字符串遵循以下格式:SWD1234-567,但我想将其作为D1234567 存储在另一个变量中以用于其他重命名目的。因此,从原始字符串中删除“SW”和“-”。

我对其他建议持开放态度,但作为 NSIS 的新手,这是我想出的。

【问题讨论】:

  • 你能不能在运行 NSIS 脚本之前用批处理文件设置环境变量,然后像这样读取环境变量:$%envVarName%
  • 我宁愿不运行批处理文件,因为我不想更改发布的过程。但是没有理由我不能在脚本的开头运行它或使用 !system 或 execwait
  • 你是说你可以做到这一点:!system "for %I in (..) do set envVarName=%~nxI"
  • 哦,天哪。我怀疑这是合法的,不适合我。只是想传达这个想法
  • 你可能不得不使用 cmd.exe !system 'cmd /c "for %I in (..) do set envVarName=%~nxI'"

标签: windows batch-file nsis


【解决方案1】:

您需要使用!system+!include 成语来读取外部命令的输出:

!tempfile MYINCFILE
!system 'for %I in (..) do echo !define MYDIR "%~nxI" > "${MYINCFILE}"'
!include "${MYINCFILE}"
!delfile "${MYINCFILE}"
!echo "${MYDIR}"

预处理器对字符串的处理有限,但可以删除已知的子字符串:

!define MYDIR "SWD1234-567"
!searchreplace MYDIR2 "${MYDIR}" "SW" ""
!searchreplace MYDIR2 "${MYDIR2}" "-" ""
!echo "${MYDIR2}" ; D1234567

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 2015-04-17
    • 1970-01-01
    相关资源
    最近更新 更多