使用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。