2014. 9. 4. 13:57

7zip 실행 압축으로 설치 프로그램 만들어 주는 배치(batch) 파일 (7zip sfx batch)

만일 아래와 같이, 여러개의 파일로 구성된 설치 프로그램을 가정해 봅시다.


 .

│  somedata.dat

│  build.txt

│  Setup.exe

├─CAB

│      inst.cab

├─RES

│      string.txt

│      ci.bmp

├─CUSTOM

│      custom.ini

└─DATA

        data1.cab

        data2.cab

위 파일들을 하나의 .exe로 묶어, 실행시 최상위 Setup.exe를 실행하려면, 실행압축을 이용하여 해결할 수 있습니다. 보통 winrar를 이용할 수 있으나, 라이센스 이슈가 있어, 추가 확인이 필요할 것입니다.


그래서 7zip의 실행압축을 이용할 수 있는데, 이는 다른 plugin을 가져와야 하고, 명령행 인자를 공부(?)해야 하는 상황이 발생합니다. 이를 해결하기 위해, 배치 파일(.bat)를 공유해, 한큐에 생성 가능하도록 하는 스크립트를 만들어 볼 수 있습니다.


우선, 7zsd_All.sfx를 다운로드 받아야 합니다.

(구글등에서 7zsd_all.sfx download로 검색하세요. 그리고, 필히 virustotal.com등에 감염 여부를 확인하시기 바랍니다. 저는, 7zsd_tools_150_2712.7z를 사용하였습니다. 해당 파일명으로 검색해 보세요.)


다음으로 7z.dll / 7z.exe가 필요한데, 7zip을 설치하면 C:\Program Files\7-Zip에 포함된 파일을 사용하면 됩니다.


마지막으로, 7zsd_All.sfx의 리소스를 수정해야 합니다.

만일, 하나의 .exe로 묶을 경우, 실제로 그 아이콘이나 파일 정보등이 변경되어야 할 것입니다.

그래서, Resource Hacker를 이용할 수 있는데, 구글등에서 쉽게 찾아서 다운로드 할 수 있습니다.

Resource Hacker에서 7zsd_All.sfx를 로드합니다. (해당 .sfx 파일은 실제 .exe 파일입니다.)

하여 새로운 아이콘 파일로 변경할 수 있습니다.


위와 같이 Version Info를 변경하여, 파일 등록 정보를 변경할 수 있습니다. 변경후 "컴파일" 버튼을 눌러줍니다.


이런 과정으로 리소스를 수정한뒤, Resource Hacker의 파일->다른이름으로 저장하여 새로운 7zsd_All.sfx로 덮어 씁니다.


이렇게 생성된 7zsd_All.sfx을 이용하여 실행압축을 하게 되는데, 다음과 같은 config.txt가 필요합니다.


;!@Install@!UTF-8!
Title="MY INSTALLER"
ExecuteParameters=""
RunProgram="Setup.exe"
Progress="no"
;!@InstallEnd@!

(자세한 설명은 구글등에서 "7zsfx config.txt"로 검색해 보시기 바랍니다.)


눈치가 있다면 확인이 바로되는데, 그런데 실제로 테스트해보니 "ExecuteParameters"는 잘 동작하지 않는듯 하였습니다. 만일 Setup.exe의 parameter가 필요하다면, RunProgram="Setup.exe /argument"와 같이 전달하시기 바랍니다. 


Setup.exe를 실행하기전 압축을 푼뒤 실행하는데, 만일 파일의 크기가 크다면, Setup.exe 실행후 시간이 걸려, 사용자 반응이 느려질 수 있습니다. Progress="yes"가 전달된다면 압축을 풀때 Progress UI가 표시되기도 합니다.


참고로 만일, UAC등이 필요하다면, 내부에서 실행되는 Setup.exe의 manifest를 이용하시기 바랍니다.


이렇다면, 다음과 같이 _Build.bat 파일을 생성할 수 있습니다.


@echo off

@rem 이전 Setup.exe, Setup.7z 삭제한다.
del Setup.exe
del Setup.7z

@rem MASTER 경로에 있는 파일을 압축한다.
@rem 경로를 변경하여, 압축시 MASTER 경로가 포함되지 않도록 한다.
cd MASTER
..\7z a ..\Setup.7z .\*.* -r

@rem 이제 다시 원래 경로로 복귀한다.
cd ..

@rem 아래 명령을 실행하여 Setup.exe를 생성한다.
copy /b 7zsd_All.sfx + config.txt + Setup.7z Setup.exe

pause


실행전, 다음과 같은 폴더 구조가 되어야 합니다.

. │ 7z.dll │ 7z.exe │ 7zsd_All.sfx │ config.txt │ _Build.bat │ └─MASTER │ Build.txt │ Setup.exe │ somedata.dat │ └─CAB inst.cab

즉, 함께 묶여 실행될 파일들을 MASTER 경로에 두고, 그 상위 경로는 7z.dll / 7z.exe 가 있어야 하며, 위에서 생성한 7zsd_All.sfx와 config.txt가 있어야 합니다. 그리고 바로위에 있는 내용을 참고하여 _Build.bat도 저장합니다.


이제, _Build.bat를 실행하면, 다음과 같이 Setup.exe가 생성됩니다.

E:\....>_Build.bat

7-Zip 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
Scanning

Creating archive ..\Setup.7z

Compressing  Build.txt
Compressing  somedata.dat
Compressing  Setup.exe

Everything is Ok
7zsd_All.sfx
config.txt
Setup.7z
        1개 파일이 복사되었습니다.
계속하려면 아무 키나 누르십시오 . . .


아마도 _Build.bat가 있는 경로에 새로운 Setup.exe가 포함되어 있을 것입니다.