在编译时获取 NSIS 中的文件夹名称

Getting folder name in NSIS at compile time

我想根据生成它们的文件夹动态命名我的 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 return 给我祖父目录的名字,这正是我想要的。现在我需要弄清楚如何将它存储在某种变量中,以便它可以在 !define 中使用。我需要以某种方式将输出捕获到控制台(而不是 for 的 return 值,它在我的 NSIS 脚本中始终为零。理想情况下,我不必使用外部插件,因为那样会成为整个团队管理的噩梦。

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

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

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

你需要使用!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