【发布时间】: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