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

时间:2018-06-22 22:37:21

标签: windows batch-file nsis

我想根据生成它们的文件夹动态命名我的EXE文件。因此,换句话说,如果我的NSIS脚本位于body { font-family: 'Source Sans Pro', Helvetica, Arial, sans-serif; font-size: 22px; color: #46545C; } h1 { font-family: 'Ubuntu', 'Source Sans Pro', Helvetica, Arial, sans-serif; font-size: 36px; } pre { font-family: 'Source Code Pro', monospace; font-size: .85em; color: #EEEEEE; background: #333333; overflow: auto; padding: 12px 18px; } .container { margin: 0 auto; padding: 0 18px; } .container-main { overflow: hidden; background: #b2a0e8; } .flexbox { display: none; } /* Media Queries */ /* ---------------------------- */ /* Large Size */ @media screen and (min-width: 40em) { .container-main { display: flex; background: #CADBD6; } .container { margin: 0 50px; } .content { flex: 1; /* Comment out this width, and Chrome displays the same functionality */ width: 80%; /* This width has the same effect */ /*width: calc(100% - 360px);*/ float: right; } .flexbox { display: block; } } 中,而我的项目位于C:\[blah]\MyProjectDir\Nullsoft\中,则输出NSIS可执行文件应为C:\[blah]\MyProjectDir\MyProject\。为了简化起见,我显然混淆了名称,文件夹的结构对我们的团队具有实际意义。

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

MyProjectDir.exe

还有一大堆可以处理诸如注册表项,安装等之类的事情。这是与我的问题有关的重要部分(因为我不想修改脚本的其余部分)。

我想将其更改为类似的内容

!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中使用它。我需要以某种方式捕获输出到控制台(而不是在NSIS脚本中返回!define的返回值,该返回值始终为零)。理想情况下,我不必使用外部插件,因为这将是噩梦在整个团队中进行管理。

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

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

我愿意接受其他建议,但是作为NSIS的新手,这就是我要提出的。

1 个答案:

答案 0 :(得分:3)

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