【问题标题】:Generate zip archive instead of executable with NSIS使用 NSIS 生成 zip 存档而不是可执行文件
【发布时间】:2016-09-22 09:26:37
【问题描述】:

我使用 NSIS 来生成可执行的打包程序。

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

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

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

你知道它是否可行吗?

【问题讨论】:

    标签: windows zip nsis


    【解决方案1】:

    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,那么您需要运行提升的批处理文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2022-06-24
      相关资源
      最近更新 更多