使用NSIS生成zip存档而不是可执行文件

时间:2016-09-22 09:26:38

标签: windows zip nsis

我使用NSIS生成可执行文件打包器。

目前这些包装产品'内容可以由生成安装程序的开发人员自定义。为此,我创建了几个.nsh脚本,每个组件一个,以及一些使用组件创建可执行文件的.nsi脚本。

最近我被要求提供简单的.zip文件以及.exe包装程序。为了避免代码重复,并确保生成的.zip和.exe安装程序共享相同的内容,我想使用相同的.nsh脚本组件来创建.zip存档而不是可执行文件。

我认为这很容易,因为NSIS生成的.exe可以用7zip打开,基本上是一个存档,但我找不到。

你知道它是否可行吗?

1 个答案:

答案 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,则需要运行提升的批处理文件。