我使用NSIS生成可执行文件打包器。
目前这些包装产品'内容可以由生成安装程序的开发人员自定义。为此,我创建了几个.nsh脚本,每个组件一个,以及一些使用组件创建可执行文件的.nsi脚本。
最近我被要求提供简单的.zip文件以及.exe包装程序。为了避免代码重复,并确保生成的.zip和.exe安装程序共享相同的内容,我想使用相同的.nsh脚本组件来创建.zip存档而不是可执行文件。
我认为这很容易,因为NSIS生成的.exe可以用7zip打开,基本上是一个存档,但我找不到。
你知道它是否可行吗?
答案 0 :(得分:0)
7-zip对NSIS格式进行了逆向工程,但由于NSIS是基于脚本的,因此结果并不完美。
我建议您为安装人员提供一种特殊的提取模式:
<强> Setup.nsi 强>
Name "Test"
OutFile "Test.exe"
RequestExecutionLevel user
InstallDir "c:\some\path\Test"
Page Components
Page Directory
Page InstFiles
Section "Required program files" INSTSEC_MAIN
SectionIn RO
SetOutPath $InstDir
File "/oname=$InstDir\MyApp.exe" "${__FILE__}"
SectionEnd
Section "Documentation"
SetOutPath $InstDir\Docs
File "/oname=$InstDir\Docs\Foo.txt" "${__FILE__}"
File "/oname=$InstDir\Docs\Bar.txt" "${__FILE__}"
SectionEnd
Section -Uninstaller INSTSEC_UNINST
WriteUninstaller "$InstDir\Uninst.exe"
#WriteRegStr ...
SectionEnd
Section -un.Uninstaller
Delete "$InstDir\Docs\Foo.txt"
Delete "$InstDir\Docs\Bar.txt"
RMDir "$InstDir\Docs"
Delete "$InstDir\MyApp.exe"
Delete "$InstDir\Uninst.exe"
RMDir "$InstDir"
#DeleteRegKey ...
SectionEnd
!include LogicLib.nsh
!include FileFunc.nsh
!include Sections.nsh
Function .onInit
${GetParameters} $0
ClearErrors
${GetOptions} "$0 " "/X" $1
${IfNot} ${Errors}
SetSilent silent
!insertmacro UnselectSection ${INSTSEC_UNINST} ; Don't include uninstaller in .zip file
${EndIf}
FunctionEnd
<强> MakeZip.cmd 强>
@echo off
setlocal
set OUTPUT=%~dp0test.zip
set INSTALLER=%~dp0test.exe
set SEVENZIP=7z.exe
set TMPROOT=%temp%\tmpinst%RANDOM%%RANDOM%
call "%INSTALLER%" /X /D=%TMPROOT% && (
call "%SEVENZIP%" a "%OUTPUT%" -tzip -mx9 -r "%TMPROOT%\*"
rmdir /S /Q "%TMPROOT%"
)
注意:如果您在.nsi中使用RequestExecutionLevel admin
,则需要运行提升的批处理文件。