2016-09-22 3 views
1

NSIS를 사용하여 실행 파일 패키지 생성 프로그램을 생성합니다.NSIS 실행 파일 대신 zip 아카이브 생성

현재 이러한 패키지 제품의 콘텐츠는 설치 프로그램을 생성하는 개발자가 사용자 정의 할 수 있습니다. 이를 위해 필자는 여러 개의 .nsh 스크립트 (구성 요소 당 하나씩)와 구성 요소를 사용하여 실행 파일을 만드는 일부 .nsi 스크립트를 만들었습니다.

저는 최근에 .exe 패키지와 함께 간단한 .zip 파일을 제공하도록 요청 받았습니다. 코드 중복을 방지하고 생성 된 .zip 및 .exe 설치 프로그램이 동일한 내용을 공유하는지 확인하려면 동일한 .nsh 스크립트 구성 요소를 사용하여 실행 파일 대신 .zip 아카이브를 작성하고 싶습니다.

NSIS에서 생성 한 .exe를 7zip으로 열 수 있고 기본적으로 아카이브이지만 쉽게 찾을 수 없다고 생각했습니다.

가능한지 아십니까?

답변

0

7-zip은 NSIS 형식을 리버스 엔지니어링했지만 NSIS는 스크립트 기반이므로 결과가 완벽하지 않습니다.

나는 당신이 당신의 설치 특별한 추출 모드를 제공하는 것이 좋습니다 것입니다 : 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%" 
) 

참고

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 

을 : 당신이 경우 .nsi에서 RequestExecutionLevel admin을 사용하면 배치 파일 elev를 실행해야합니다. ated.

관련 문제