使用NSIS生成zip存档而不是可执行文件
问题描述:
我使用NSIS生成可执行文件打包程序。使用NSIS生成zip存档而不是可执行文件
当前,这些打包产品的内容可以由生成安装程序的开发人员自定义。为此,我创建了几个.nsh脚本,每个组件一个,以及一些使用组件创建可执行文件的.nsi脚本。
我最近被要求提供简单的.zip文件以及.exe打包程序。为避免代码重复,并确保生成的.zip和.exe安装程序共享相同的内容,我想使用相同的.nsh脚本组件来创建.zip存档而不是可执行文件。
我想这可能是容易的.exe文件由NSIS生成用7zip可以打开,并且基本上是一个压缩文件,但我怎么也找不到。
你知道它是否可行吗?
答
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
,那么你需要运行批处理文件ated。