在编译时获取 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
我想根据生成它们的文件夹动态命名我的 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