인스톨프로그램

CMD BAT 인스톨 2018. 2. 6. 21:52
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://devblog.tistory.com/entry/%EC%9D%B8%EC%8A%A4%ED%86%A8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0-%EC%84%A4%EC%B9%98-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%A7%8C%EB%93%A4%EA%B8%B0




블로그 만들고 처음으로 강의성 있는(?) 글을 써보네요,,

게임, 유틸 등을 설치 할 때 파일을 받으면 설치를 시작하는데요

그런 설치 프로그램을 만드는 방법에 대해 글을 써봅니다.

1. 인스톨 팩토리 이용하기



저녀석이 인스톨 팩토리 입니다.

옛날에는 저걸로 설치당하는(?) 일이 많았는데

요즘은 보기 힘들어졌습니다.

이유는 잘 모르겠네요;;



네 바로바로 이게 Install Factory 입니다!

간단합니다. 쉽게쉽게 만들 수 있게 해놨어요,

이정도면 꽤 쉬운 프로그램이죠^^

뭐 그래서 더 이상 말할 것도 없구요,

압축률 : 162MB (169,913,272 바이트) -> 85.9MB (90,148,050 바이트)

다운로드

(출처 : 알 길이 없네요;; edison1111@daum.net , 김종민 님이 만드셧습니다.)

2. Smart Install Maker (스마트 인스톨 메이커) 이용하기



이것도 쉽게 인스톨 프로그램 만드는 프로그램 중 하나입니다.



짠! 이게 스마트 인스톨 메이커입니다.

이것도 쉽게쉽게 만들어놨습니다.

이것도 보기만 해도 바로바로 만들 수 있게 되어 있습니다.

아마 이게 제일 쉬운 듯 합니다.

단점은 적지 않을수 없네요

느려요,,, 정말 느려요

162MB 파일을 설치파일로 만드는데 10분 내외 걸렸습니다.

인스톨팩토리에 비교하면 말을 할 수 없죠,,

압축률 : 162MB (169,913,272 바이트) -> 73.1MB (76,660,349 바이트)

(출처 : http://www.sminstall.com/ )

직접받기

출처사이트에서 받기

클릭

한글패치 받기

(받은 후에 실행 하시구 Smart Install Maker 설치 후 Preferences -> Language -> Korean(한국어) 클릭하시면 됩니다.)

3. NSIS (Nullsoft scriptable Install System) 이용하기



드디어,, 좀 많이 봤던 거네요

제가 얼마 전까지만 해도 찾고 다니던 겁니다.

자세히 보니 아이콘 위에 NSIS 글자가 있었네요,,, ㅠㅠ

설치하고 실행해 봅니다@!



ㅇㅇ???

넌 뭐니..? 영어로 어쩌구 저쩌구 보이는데 검은건 글씨요,,,,

저기서 그냥 ZIP 파일을 설치 파일로 만들고 싶다 하시는 분들은

Installer based on ZIP file 으로 진입하시구요

다른 분들은 자기가 열심히 스크립팅 합시다!

라면 뭐하죠,,,,

NSIS 의 단점이라 하면 자기가 알아서 스크립팅 해야합니다.

Nullsoft 에서 저런 프로그램 꽁짜로 줬는데 뭐라 할 수 없죠.

그런데 HM NIS Edit 라는 프로그램이 NIS 확장자 파일을 쉽게 수정할 수 있게 하면서

스크립트 작성 마법사까지 할 수 있게 해주는군요^^



자자 HM NSI Edit 프로그램을 실행 시킨 후에

왼쪽 위에 형광팬으로 노랗게 칠해진 부분을 클릭합니다.



그러면 이게 뜨는데요

이제 끝난 겁니다^^

위의 2개의 프로그램처럼 설치할 파일을 작성한다던지

바로가기는 뭐로 만들거냐, 언인스톨 기능은 사용할꺼냐,, 어쩌구저쩌구 그러는데요

쉽게쉽게 설정해주시면 됩니다^^

설정 후 저장버튼을 누르셔서 원하는 위치에 저장합니다.



그러면 위처럼 저런 파일이 하나 만들어집니다.

마우스 오른쪽 클릭 후 (Compile NSIS script) 를 클릭하시면

MakeNSISW 프로그램이 켜지면서 중얼중얼 하다보면

띠링 소리와 함께 완료됩니다.. 빠르게요,..



이렇게 말이죠!

만약 중얼중얼 영어로 뜨다가 갑자기 Error 가 뜨면

Error 어쩌구 on line (숫자)

이렇게 뜰겁니다.

그러면 on line (숫자) 있는 게 NSI 파일에 (숫자) 번째 줄에 문제가 있다는 겁니다.

그러면 HM NIS Edit 프로그램으로 그 문제가 있는 줄수에 가서

그 줄을 지우던지 고치던지 하시면 됩니다.

성공하셧다면 설치파일을 가지고 놀면 됩니다^^

압축률 : 162MB (169,913,272 바이트) -> 85.2MB (89,366,825 바이트)

(출처 : http://nsis.sourceforge.net/Main_Page)

직접다운로드

출처 사이트에서 다운로드

클릭

HM NSI Edit

제가 아는 인스톨 프로그램은 여기까지 입니다.

이밖에 WINRAR 를 이용해서 만드는 방법도 있는데

이건 단순히 압축을 푸는 방식인 듯 하구요

Install Shield 도 있는데 이건 유료 프로그램이고 위의것보다 훨씬 복잡하다고 합니다.

NSIS 가 무료 프로그램중 압축률이 가장 좋다고 들었는데

파일 확장자가 달라서 그런지 저는 조금 낮게 나왔네요

그래도 저는 NSIS가 좋습니다^^

자신에게 맞는 프로그램을 선택해서 하시면 됩니다^^



출처: http://devblog.tistory.com/entry/인스톨-프로그램-만들기-설치-프로그램-만들기 [개발자의 꿈 【 Dokdo:This is Part of Korea 】]





///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://petra.tistory.com/1061




NSIS 로 배포파일 만들기

1. NSIS 파일 다운로드 후 설치하기

http://nsis.sourceforge.net/Download -  nsis-3.01-setup.exe


2. HM NIS Edit 다운로드해서 설치하기

http://hmne.sourceforge.net/ -  nisedit2.0.3.exe

 


3. HM NIS Edit 실행


4. 위 그림의 노란색 스크립트 작성 마법사를 클릭하거나 파일/스크립트작성마법사 메뉴를 선택한다.



위 그림에서 프로그렘 이름에 원하는 이름을 지정한다.


위 그림에서 처럼 기본값으로 Korean 이 선택되어 있다.


위 그림 처럼 프로그램 설치 보여줄 라이센스 파일을 TXT 파일을 지정하면 되는데 여기서는 삭제하고 무시한다. (기본값으로 지정된 라이센스 TXT 파일이 지정된 상태로 다음 버튼 눌러 진행하면 나중에 컴파일 에러 난다)


위 그림에서 노란색 부분을 전부 삭세하고 설치할 실행 파일과 관련 DLL, DB 파일들을 추가한다. 



위 그림에서 프로그램은 추가한 실행 파일명이 보여주게 된다. (여기서는 편의 상 기본값을 가진 사진을 보여준다)



위 그림에서 처럼 노란색 부분의 스크립트 저장을 선택하고 완료 버튼을 누른다.


위 그림처럼 test 라고 바탕화면에 스크립트 파일을 저장한다.


위 그림처럼 완성된 스크립트 파일 내용을 보여준다.

- NSIS 를 실행한다.


위 그람에서 노란색 부분의 Compile NSI scrips 를 선택한다.


파일/Load Script 메뉴를 선택한다.


저 위에서 바탕화면에 저장했던 test 스크립트 파일을 선택해서 로드한다.


위 그림처럼 컴파일 되면서 Setup.exe 설치 파일을 만들어 진다.
그림의 노란색 부분의 Test Installer 버튼을 누르면 설치 프로그램이 실행된다.

참고 : http://dh-computing.tistory.com/3



출처: http://petra.tistory.com/1061 [Free, Freedom]





////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: https://m.blog.naver.com/PostView.nhn?blogId=yin9054&logNo=220961477963&proxyReferer=https%3A%2F%2Fwww.google.co.kr%2F



해당글 처음 스크립트 툴을 이용하여 설치 프로그램을 만들어 본 것이므로 부족한 부분과 틀린 부분이 있을 수 있음을 양해부탁드립니다.


준비물 : Nsis, HM NIS Edit, 설치 프로그램으로 만들 프로그램 및 포함시킬 기타

설치 프로그램으로 만들 프로그램 제작 방법은 다음 글에서 소개하므로 이 글에서는 생략합니다.


우선 Nsis와 HM NIS Edit 가 설치가 필요하겠조?


아래의 링크에서 각각의 툴을 설치합니다.

http://nsis.sourceforge.net/Download

Nsis 홈페이지 내 Download

 

http://hmne.sourceforge.net/

HM NIS Edit 홈페이지


HM NIS Edit 홈페이지 하단 부


각 툴에 대한 설치 내용은 생략하겠습니다.


NSIS 툴이 먼저 설치가 되어야 HM NIS Edit 툴을 이용하는데 있어 문제가 발생하지 않습니다.


각 위 툴을 설치한 후 이후 첨부 되어있는 FindProc.zip 압축 파일을 풀고 내용물 중 FindProcDLL.dll 파일을 NSIS 설치 경로에 붙여넣어줍니다. 아래의 경로는 제가 임의로 사용한 경로입니다.


D:\NSIS\Plugins\x86-ansi

D:\NSIS\Plugins\x86-unicode


위 경로에 파일을 넣어야 프로세스 실행에 대해 확인할 수 있으므로 꼭 넣어야 됩니다.


 

'스크립트 작성 마법사'를 눌러 'NSIS 스크립트 마법사' 창을 활성화시킵니다.


'다음' 버튼을 누릅니다.
 

프로그램 이름 : 사용자가 지정하고 싶은 이름을 기입

프로그램 버전 : 해당 프로그램 버전 기입

프로그램 배포자 : 배포자 이름이나 회사 이름 기입

프로그램 웹사이트 : 사용자 블로그나 회사 홈페이지 주소 기입
 

설치 아이콘 : 설치 프로그램(패키지)의 아이콘 설정

설치 파일 : 설치 프로그램(패키지)의 이름 설정

설치 언어 : 설치 프로그램(패키지)를 실행 했을 때 지원하는 언어 설정

GUI : 설치 화면 GUI 선택

압축 : 설치 프로그램(패키지)화 압축 방식 선택
 

프로그램 기본 디렉토리 : 프로그램 설치 경로 설정

라이센스 파일 : 라이센스 내용을 기입한 txt 파일
 

① : 그룹 추가, 그룹 수정, 그룹 삭제

② : 파일 추가, 폴더 추가, 파일 수정, 파일 삭제

③ : 그룹 목록

④ : 파일 항목


이 부분이 가장 중요한 부분입니다. 설치될 그룹명 이름을 ①, ③을 통해 지정 후


②, ④을 통해 설치될 그룹에 내포시킬 파일과 디렉토리를 지정합니다.


시작 메뉴 등록과 바로가기 설정하는 부분입니다.


설치 완료 후 어떤 파일을 실행할지 설정하는 부분입니다.


언인스톨러 에 대한 문구와 아이콘을 설정하는 부분입니다.
 

'스크립트 저장'을 체크 후 '완료'버튼을 누르세요.

저장 이후 뜨는 화면이 아래의 그림들과 같습니다.









위 단계들에 대해 작성 및 체크가 완료 되시면 HM NIS Edit 툴의 상단 부분에 위치해 있는 '스크립트 컴파일' 버튼을 눌러 컴파일을 진행합니다.


컴파일이 완료 되면 위 그림처럼 HM NIS Edit 툴의 우측 최하단 부분에 결과화면을 볼 수 있습니다.

'Output'에 적혀 있는 경로가 설치 패키지 파일이 만들어질 부분이니 나중에 필요하실 때 활용하시면 됩니다.


이제 부터 NSIS 툴을 실행합니다. NSIS 툴을 이용해여 'Setup.exe' 패키지를 만들 수 있습니다.


'Complie NSI scripts'라는 부분을 클릭합니다.


상단에 위치해 있는 'File'을 눌러줍니다.


'File-Load Script'를 눌러줍니다.
 

HM NIS Edit 툴에서 만든 스크립트 파일을 선택합니다.
 

선택하면 바로 파일 압축하는 작업에 들어갑니다. 작업이 끝났을 시 'Test Installer' 버튼이 활성화 됩니다.


위에서 언급한 설치 패키지 파일 위치를 참고하여 실행을 해보면,


위 그림과 같이 설치 패키지가 실행되는 것을 확인 할 수 있습니다.



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://and0329.tistory.com/entry/%ED%8E%8C-NSIS-%EA%B8%B0%EB%B3%B8%EC%A0%81%EC%9D%B8-%EC%82%AC%EC%9A%A9%EB%B0%A9%EB%B2%95

[펌] NSIS 기본적인 사용방법


타 블로그에서 퍼온 글이다.


배포 프로그램 이름 지정

!define APPNAME "FreemontEncoder"

배포 프로그램의 이름 및 버전 표시 (실제 배포 프로그램 실행 시 화면에 표시되는 이름)

!define APPNAMEANDVERSION "FreemontEncoder 2.0"

<?xml:namespace prefix = o /> 

; Main Install settings

프로그램 이름 : 위에미리 정의한 APPNAMEANDVERSION을 지정한다.

Name "${APPNAMEANDVERSION}"

기본 설치 경로

InstallDir"$PROGRAMFILES\Freemont\Freemont Encoder"

배포 프로그램 정보가 등록될 레지스트리 경로

InstallDirRegKey HKLM"Software\${APPNAME}" ""

컴파일 후 배포 프로그램이 출력될 경로 지정

OutFile "C:\FMSSetup.exe"

 

; Modern interface settings

; UI Modern 으로설정한다.

!include "MUI.nsh"

 

경고 페이지 및 설치 종료 후 바로 실행할 파일 지정

!define MUI_ABORTWARNING

!define MUI_FINISHPAGE_RUN"$INSTDIR\Freemont Encoder.exe"

 

설치 및 삭제 아이콘 지정(주의 : 반드시 설치와 삭제 아이콘은 포멧이 일치해야 한다.)

!define MUI_ICON "res\FMS.ico"

!define MUI_UNICON"res\UnInstall.ico"

 

매크로 페이지 삽입

환영 메시지 페이지

!insertmacro MUI_PAGE_WELCOME

설치 경로 선택 페이지

!insertmacro MUI_PAGE_DIRECTORY

설치 상태 페이지 : 설치퍼센트 표시되는 페이지

!insertmacro MUI_PAGE_INSTFILES

완료 페이지

!insertmacro MUI_PAGE_FINISH

 

삭제 확인 페이지

!insertmacro MUI_UNPAGE_CONFIRM

삭제 상태 페이지 : 삭제퍼센트 표시되는 페이지

!insertmacro MUI_UNPAGE_INSTFILES

 

; Set languages (first is default language)

설치 시 표시 가능한 언어를 설정한다.

처음에 설정한 언어가 기본 언어가 된다.

!insertmacro MUI_LANGUAGE"Korean"

!insertmacro MUI_LANGUAGE"English"

!insertmacro MUI_RESERVEFILE_LANGDLL

 

설치 섹션

Section "Freemont Encoder"Section1

 

           ;설치 경로에 동일한 파일 존재 시 덮어씌우라는 의미

           SetOverwriteon

 

           ;파일이 설치될 경로를 위에서 지정한 INSTDIR 로 한다.

           SetOutPath"$INSTDIR\"

           ;INSTDIR 에 설치할 로컬 파일 경로를 지정한다.

           File"C\FMS\release\Freemont Encoder.exe"

           File"C\FMS\release\config.ini"

           ;파일이 설치될 경로를 windows\system32로 한다.

           ;일부 dll 이나 필수 파일 등등

           SetOutPath"$SYSDIR"

           ;windows\system32 에 설치할 로컬 파일 경로를 지정한다.

           File"C\FMS\release\FLogo.ax"

           ;dll 이나 ocx, ax 와 같이 레지스트리에 등록이 필요한 경우 (cmd : regsvr32.exe)

           RegDLL"$SYSDIR\FLogo.ax"

           ;바로 가기를 등록한다.

           ;바탕화면에 바로 가기 등록

           CreateShortCut"$DESKTOP\Freemont Encoder.lnk" "$INSTDIR\FreemontEncoder.exe"

           ;시작 – 프로그램에 바로 가기 등록

           CreateDirectory"$SMPROGRAMS\Freemont"

           CreateShortCut"$SMPROGRAMS\Freemont\Freemont Encoder\Freemont Encoder.lnk""$INSTDIR\Freemont Encoder.exe"

           CreateShortCut"$SMPROGRAMS\Freemont\Freemont Encoder\Uninstall.lnk""$INSTDIR\uninstall.exe"

SectionEnd

 

종료 섹션

Section -FinishSection

           ;종료 섹션은 특별한 일이 없는 이상 아래와 같이 설치하는 프로그램에 대한 정보를 레지스트리에 저장한다.

           WriteRegStrHKLM "Software\${APPNAME}" "" "$INSTDIR"

           WriteRegStrHKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}""DisplayName" "${APPNAME}"

           WriteRegStrHKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}""UninstallString" "$INSTDIR\uninstall.exe"

           WriteUninstaller"$INSTDIR\uninstall.exe"

SectionEnd

 

; Modern install component descriptions

!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN

           !insertmacroMUI_DESCRIPTION_TEXT ${Section1} ""

!insertmacro MUI_FUNCTION_DESCRIPTION_END

 

삭제 섹션

Section Uninstall

 

           ;설치 정보 레지스트리를 삭제한다

           DeleteRegKeyHKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APPNAME}"

           DeleteRegKeyHKLM "SOFTWARE\${APPNAME}"

 

           ;파일 삭제

           ;삭제 파일 삭제

           Delete"$INSTDIR\uninstall.exe"

          

           ;바로 가기 삭제

           Delete"$DESKTOP\Freemont Encoder.lnk"

           Delete"$SMPROGRAMS\Freemont\Freemont Encoder.lnk"

           Delete"$SMPROGRAMS\Freemont\Uninstall.lnk"

 

           ;설치 파일 삭제

           Delete"$INSTDIR\Freemont Encoder.exe"

           Delete"$INSTDIR\config.ini"

           ;windows\system32 에 설치된 파일에 대한 레지스트리 삭제 (cmd : regsvr32/u)

           UnRegDLL"$SYSDIR\FLogo.ax"

           ;레지스트리에서 삭제된 파일 삭제

           Delete"$SYSDIR\FLogo.ax"

 

           ;바로 가기 및 설치 디렉토리 삭제

           RMDir"$SMPROGRAMS\Freemont\Freemont Encoder"

           RMDir"$INSTDIR\"

 

SectionEnd

 

배포 프로그램 초기화 함수

Function .onInit

           ;설치 언어 선택 페이지를 표시한다.

           !insertmacroMUI_LANGDLL_DISPLAY

 

FunctionEnd


출처 : http://skql.tistory.com/505



출처: http://and0329.tistory.com/entry/펌-NSIS-기본적인-사용방법 [초징]





///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


출처: http://fogria.tistory.com/431


NSIS 번외 - 레지스트리


그냥 이곳이 있었단 사실만 알아주면 감사하겠습니다.
사실 전 써본적도 없는 명령어라 이 기능을 설명할 날이 올줄은 몰랐습니다만, 기회가 닿았으니 이렇게 써봅니다.

10
음... 어느 분께서 레지스트리 관련 질문을 해주셨군요.

사실 본지는 조금 되었는데, 요근래 바빠서 글 쓸 컨디션이 못된 터라... 이거 죄송합니다.

여튼, 질문 내용을 봅시다.

레지스트리 경로를 설정하고 싶은데... 지우라하셔서 어찌지정하나요!! 예시로 알려쥬세요 ㅠㅠ


레지스트리 경로를 설정하고 싶은데 어떻게 해야하는가... 하는 질문입니다.


여기서 일단 예시 구문을 봅시다. 아래 예시구문은 HM NIS 마법사로 기본설정으로 작성하면 나오는 구문입니다.

솔직히 나온지 12년동안 업데이트가 없는 에디터를 써도 되는건지는 잘 모르겠지만... 달리 선택지도 없습니다. ;ㅅ;

WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\AppMainExe.exe"

티스토리 배경을 검은색으로 지정하는게 아니었는데... 글 배경색이 검은색으로 지정되어 있어서 그런지 생 복붙하기 힘들군요. 여튼...

WriteRegStr은 레지스트리를 작성하는 명령어입니다. WriteRegistryString...의 약자겠지요 뭐.

String은 문자열 형식으로, 말그대로 레지스트리 문자열을 작성하겠다. 이말입니다.

그런데 솔직히 저렇게 놓고 보면 저게 무슨소리인지 감이 안옵니다. 그럴때 필요한게 레퍼런스죠.

레퍼런스는 항상 위대합니다.

http://nsis.sourceforge.net/Reference/WriteRegStr


설명은 이러합니다.

Write a string to the registry. See WriteRegExpandStr for more details.

문자열을 레지스트리에 작성합니다. WriteRegExpandStr 에서 좀더 자세히 볼수 있습니다.

음... 뭐 다 아는 내용이네요. 저 링크는 조금 있다 보도록 합시다.

문법은 이러합니다.

WriteRegStr root_key subkey key_name value

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"

root_key는 이걸 말합니다.


윈도우 버전따라 세부 UI는 다를수도 있겠지만 그부분은 양해 바랍니다.

값은 WriteRegExpandStr 페이지에 따르면

HKCR or HKEY_CLASSES_ROOT

HKLM or HKEY_LOCAL_MACHINE

HKCU or HKEY_CURRENT_USER

HKU or HKEY_USERS

HKCC or HKEY_CURRENT_CONFIG

HKDD or HKEY_DYN_DATA

HKPD or HKEY_PERFORMANCE_DATA

SHCTX or SHELL_CONTEXT

라고 합니다.

예시에서는 HKLM이었으니 HKEY_LOCAL_MACHINE 폴더 안에 작성하겠다는 의미입니다.


subkey 는 루트폴더 안의 어느 경로에 작성할 것인지를 말합니다.

예시에선 "${PRODUCT_DIR_REGKEY}" 라는 값을 사용하고 있는데, 이건 HM NIS 마법사로 생성했다면 문서 상단에 정의됩니다.

!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"

Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe

라고 정의되어있습니다.

요컨데 HKEY_LOCAL_MACHINE 루트폴더 안의 Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe 경로 안에 작성하겠다는 의미입니다.(AppMainExe.exe도 폴더 이름임에 주의합니다.)

Software\Microsoft\Windows\CurrentVersion\App Paths\ 안에는 설치된 어플리케이션(프로그램)들의 실행파일 경로가 저장됩니다. 정확히는 실행파일 경로 레지스트리 정보가 들어있는 폴더가 들어있는거지만요.

key_name은 레지스트리 키의 이름을 지정합니다. 공백이라면(기본값)으로 저장됩니다.


사진의 빨간 네모표시부분에 들어갈 내용을 작성하는겁니다.

(위 사진은 애드가드의 실행파일을 가리키는 레지스트리입니다.)


value는 레지스트리의 데이터 값을 작성합니다.

예시의 경우 "$INSTDIR\AppMainExe.exe" 라고 되어있는데, INSTDIR이 설치경로를 뜻하니 설치경로\AppMainExe.exe 정도가 되겠네요.

즉, 실행파일의 위치를 데이터로 작성하게 됩니다.


중간의 종류 부분은 자동으로 REG_SZ 로 작성됩니다.

언신스톨과 관련된 레지스트리는 Software\Microsoft\Windows\CurrentVersion\의 Uninstall 폴더 안에 있습니다.


실행파일 경로나 지정하고 그만인 App Paths와는 달리, 언인스톨러 레지스트리 폴더 안에는 다양한 레지스트리가 있기 때문에 HM NIS에서 언인스톨러를 사용한다고 했을 때에도

!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"

!define PRODUCT_UNINST_ROOT_KEY "HKLM"

 WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\AppMainExe.exe"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"

  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

... 같은 여러 레지스트리를 작성합니다. 각각의 내용중 제일 중요한것은

DisplayName은 프로그램 추가/제거 리스트에 보일 이름

UninstallString은 언인스톨러 경로 지정

정도.. 입니다. 나머지 정보도 없으면 곤란하긴 하지만요.


레지스트를 삭제할때는 DeleteRegKey 명령어를 사용합니다.

DeleteRegKey root_key subkey

DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"

DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"

이런식으로 씁니다.

루트키와 서브키 만으로 이루어져 있으며, 서프키가 가리키는 대상 폴더 자체를 삭제해버립니다.

덕분에 저 수많은 언인스톨 레지스트리를 하나씩 삭제하는 수고를 덜수 있지요.



일단 레지스트리의 작성과 삭제에 대한 내용은 여기서 마칩니다.

혹 문자열 형 외의 데이터형으로 작성하고 싶다면

32비트 정수형 데이터 작성용 WriteRegDWORD

바이너리형 데이터 작성용 WriteRegBin

문자열이지만 종류를 REG_EXPAND_SZ1 2로 작성하고 싶을때 쓰는 WriteRegExpandStr

가 있습니다.

이 명령어들은 써넣을 값의 형태가 정수인지 바이너리니 하는 식의 차이일뿐, 사용법은 전부 동일합니다.


읽어주셔서 감사합니다.



  1. 레퍼런스 원문엔 REG_EXPAND_STR로 써있는데, STR형 레지스트리는 달리 없는걸로 보입니다. [본문으로]
  2. REG_SZ는 단순 문자열만 받을 수 있지만, REG_EXPAND_SZ는 %PATH%같은 윈도우의 시스템 환경변수를 사용 가능합니다. [본문으로]


출처: http://fogria.tistory.com/431 [포그리아의 무한공간]





///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



출처: http://fogria.tistory.com/419


안녕하세요.

오래간만에 글을 또 하나 쓰게 되었습니다.


다른건 아니고, nsis에서 종종 쓰이는 7za.exe의 커맨드라인 명령어에 대해 조금 서술하려고 합니다.

은근 관련 질문이 자주 올라오더라고요.

사실 강좌글 사이 어딘가에 아주 조금 써있긴 합니다만.


뭐, 잡설은 여기까지 하고, 일단 7za를 사용하는 명령어의 예시를 한번 봅시다.


nsexec::exec '$INSTDIR\7za.exe e "$instdir\test.7z.001"'

하필 배경을 검은색으로 골라서 글박스 쓸때마다 고통받아야 하는건지 원

뭐 이런겁니다. 대략 test.7z.001 파일을 그자리에 풀어준다는 뜻입니다.


정리하면 대략

nsexec::exec '7za.exe지정 명령어 스위치 "대상A" "대상B" 스위치'

이런식이 됩니다.


코드 형식은 nsis 명령어를 기본으로 하지만, 본 글의 명령어 설명은 7za.exe의 지원 명령어에 기반하고 있기 때문에, 실제로는 nsis 상에서 지원되지 않는 명령어가 있거나 할 수 있습니다. (저도 필요한게 아니면 쓰지 않아서 얼마나 지원되는지는 모릅니다.)


*지금까지 예시로 쓰인 코드에서는 어지간하면 7za지정, 명령어, 대상A 까지만 쓰였습니다.


7za.exe지정 - 7za.exe가 위치한 곳을 가르킵니다. 예시는 인스톨 경로에 7za.exe를 까놓고 실행시키기 때문에 $INSTDIR 안에 있는걸 상정하고 지정하고 있습니다.


명령어 - 어떤 행동을 할 것인지 지정해줍니다. 압축을 풀거나, 압축파일에 추가하거나, 압축파일 안에서 무언가를 지우거나 등등...


스위치 - 부가 옵션입니다. 압축할때 압축율 지정(최소압축율 : -mx0, 최대압축율 : -mx7 등)이나 압축 형식(zip 파일 압축 : -tzip 등)을 지정해주거나 기타 잡다한 조건을 거는 용도로 씁니다. 일일히 정리하자면 솔직히 다 알지도 못하고 있을 뿐더러 너무 많지요.

 위 정리에서 스위치가 두 곳에 위치하는데, 보통 앞 스위치 자리에는 압축 형식등을 지정해주고, 나머지는 뒤에 씁니다. 또한 여러개의 스위치를 넣을 때는 띄어쓰기로 구분해줍니다.

 참고로, 스위치에 따라서는 대상 A와 대상 B 사이에 들어가거나 하는 경우1도 있습니다.


대상 A, 대상 B - 명령어를 실행할 대상입니다. 보통 대상 A가 압축을 풀거나 파일을 추가할 압축파일이고, 대상 B는 압축파일에서 삭제할 파일이나 추가할 파일 등을 지정해줍니다.

 경우에 따라 한번에 다수의 특정 파일만 넣고 싶거나 할 때에는 텍스트 파일로 리스트를 만들어서 그 리스트를 대상 B 대신 넣어줄 수도 있습니다.2


예를 들어 

nsexec::exec '$INSTDIR\7za.exe a "$instdir\bin\minecraft.jar" "$PLUGINSDIR\MOD\*"

와 같이 작성한다고 하면

INSTDIR에 있는 7za.exe를 이용, instdir\bin\minecraft.jar 안에 $PLUGINSDIR\MOD에 있는 모든 파일을 추가해준다.

라는 뜻입니다.


이하 대략적인 명령어 정리입니다.

a - 파일을 추가해줍니다. 대상A에 대상B를 넣어줍니다.

d - 파일을 지웁니다. 대상A 안에 있는 대상B를 지워줍니다.

e - 압축을 풉니다. 압축 파일 내 구조고 뭐고 싹다 무시하고 파일만 골라내서 내놓습니다.

x - 압축을 풉니다. 압축 파일 내 경로를 유지한 채로 내놓습니다.

이하 (일단)여기에선 쓸일 없는 명령어

l - 압축파일 내 리스트를 봅니다.

u - 압축파일을 업데이트 합니다. 겹치는 파일은 새걸로 바꿔주고, 없던건 추가해줍니다.

t - 압축파일을 무결성 테스트합니다.

b - 압축파일을 벤치마킹(...) 합니다.


이하 대략적인 스위치입니다. 너무 많아서 몇개만 정리합니다.

-r 폴더 안에 폴더가 또 있으면 그 폴더까지 탐색합니다.

 -t{형식} 압축파일 형식을 지정해줍니다. -tzip 이면 zip, -tiso면 iso 형식을 지정합니다.

그런데 위에 쓰인 예시들 보면 알겠지만 안써도 크게 문제되진 않습니다. 안돌아갈때만 써주세요.

보통 대상A 앞에 씁니다.

 -o{경로} 압축을 풀 때 그 경로를 지정해 줍니다.

예를 들어, C:\YOU 폴더에 넣고 싶으면 -oc:\YOU 같은 식으로 써줍니다.

 -ao{플래그} 이름이 겹칠때 어떻게 할건지 정해줍니다.

플래그는

a 덮어쓰기, s 스킵, u 압축 풀 파일 이름을 이름_1 같은 식으로 바꿈, t 이미 존재하는 파일의 이름을 바꿈

와 같습니다. 사용할 때는 -aoa, -aos, -aou, -aot 처럼 씁니다.


이정도면 일반적으로 쓰기엔 무리가 없을겁니다.

위에서 나온 명령어나 스위치 등은

http://www.dotnetperls.com/7-zip-examples

https://sevenzip.osdn.jp/chm/cmdline/

두 사이트를 참고했습니다.

설명은 적당히 의역해서 정리하기 때문에 영어에 능하다면 직접 들어가서 보는걸 추천합니다.


읽어주셔서 감사합니다.



출처: http://fogria.tistory.com/419 [포그리아의 무한공간]


///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



출처: http://fogria.tistory.com/420



nsis 번외 - 더 쉽게(?) 창크기를 바꿔보자



다른건 아니고 간만에 NSIS글을 쓰려고 합니다.
누가 시험기간 한복판에 질문을 올려놨거든요!
이번 질문은 바로


입니다.


요는 "굴림체로 맑은고딕과 똑같은 크기의 설치창을 어떻게 출력하느냐" 네요.


솔직히 이미지 사이즈는 창 크기 조절하면 늘어나고 줄어들고 하게 되어있습니다.

굳이 비왜곡 상태의 이미지를 보고 싶다면야


!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH


이런걸 쓸 수야 있긴 한데, 맑은고딕 9폰트에 적용하고 돌려보면 알겠지만



노스트래치 미적용


노스트래치 적용


보면 알겠지만 맑은고딕이라고 왜곡 안된건 아니고, 그냥 좀 멀쩡하게 보일 뿐입니다.

그나마 비왜곡 상태에 가까운거라 하면 굴림 10폰트 정도?


아무튼, 이미지 왜곡부분은 그냥 만들어서 창 띄워놓고 그 창 크기에 맞게 이미지 만드는것밖에 답이 없습니다.

아니면 처음부터 ns다이얼로그 이용해서 커스텀창 만들고 그걸로 띄우던가...


뭐 이미지 부분 잡설은 여기까지 하고, 창 크기 조절에 대해 이야기 해보겠습니다.

사실 이것도 똑같은데, 원하는 크기의 UI랑 대보고 크기 조절 일일히 해주면 됩니다.

ns다이얼로그 쓰는 방법도 있지만 결국 대보고 맞춰야 하는건 똑같습니다.


어쩌면 다른 신박한 방법이 있을지도 모르겠는데, 제 검색실력이 미천해서인지 못찾았습니다.


아무튼, 윈도우 창을 조절하는 방법은 여럿 있겠는데, 리소스해커를 소개했었지만 솔직히 그거 일일히 하나하나 조정해주기 생각보다 힘듭니다.

고로 리소스해커 쓰는법 말고 조금 다른걸 시도해봅시다.





이게 그냥 굴림 10폰트고


이게 굴림10폰트에 윈도우 사이즈 조절 건겁니다.

(가로,세로 넓혔습니다)



이 방법으로 그럭저럭 쉽게 조절 가능하긴 한데 뭐 그렇다고 무한정 조절 가능한건 아닌듯하고... 기본크기보다 줄이거나 지나치게 크게 늘리는건 또 안되는것같습니다. UI 버튼 이름이나 크기나 그런것도 약간 차이가 있고...

뭐 고급진걸 원하면 고오급진 기술과 노오력이 필요한 법이니 그러려니 합시다.


방법을 말하자면

http://nsis.sourceforge.net/NsResize_plug-in

을 이용합니다. 받아서 압축 풀고 내용물을 NSIS 경로(HM말고)에 덮어씌우면 됩니다.

안에 예시파일까지 다 있긴 한데, 영어라 읽기 좀 뭐하니 조금 주석을 단 버전을 동봉합니다.


 냉무 라지윈도.nsi


 라지윈도.nsi



라지윈도는 LargeWindow 예제에 주석좀 달고 언인스톨부 주석처리한 것이고

냉무 라지윈도는 LargeWindow 기반으로 인스톨마법사 백지 인스톨러에 적용한 버전입니다.



/*

  This script uses the nsResize plug-in to resize your NSIS installer

  and uninstaller windows.

*/


!include MUI2.nsh ;반드시 MUI2여야함. 그냥 MUI는 안됨

!include nsResize.nsh


Name LargeWindow

OutFile LargeWindow.exe

;RequestExecutionLevel user

InstallDir $EXEDIR

ShowInstDetails show

setfont "굴림체" 9


;**********************************************************************************

; Increase the width and height by these units:

; 사이즈 설정. 뒤에 u는 안붙여도 됨. 다만 안붙인거랑 붙인건 크기 차이가 있다.


!define AddWidth 100

!define AddHeight 100


;**********************************************************************************



; Resizing still works with MUI interface customisation.

;!define MUI_LICENSEPAGE_RADIOBUTTONS

;!define MUI_COMPONENTSPAGE_SMALLDESC

;!define MUI_UI_COMPONENTSPAGE_NODESC

!define MUI_FINISHPAGE_NOAUTOCLOSE ;설치 완료 후 설치완료 안내페이지로 자동으로 넘어가는거 막음

;!define MUI_FINISHPAGE_RUN $INSTDIR\LargeWindow.exe ;설치 완료 후 파일 실행여부를 물어보며, 이때 실행할 파일 지정함


; These will do the initial window resizing.

!define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit ;인스톨러 리사이징

;!define MUI_CUSTOMFUNCTION_UNGUIINIT un.myGUIInit ;언인스톨러 리사이징


;**********************************************************************************

; Each MUI install page must have a show function assigned. 인스톨러 파트.


!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePage_Show ;환영페이지

!insertmacro MUI_PAGE_WELCOME


;!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePage_Show ;라이센스 페이지

;!insertmacro MUI_PAGE_LICENSE `${__FILE__}` ;${__FILE__}는 nsi파일 스크립트(소스코드) 전문을 출력함. 즉 라이선스 페이지에 소스코드가 나옴.


!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPage_Show ;경로설정

!insertmacro MUI_PAGE_DIRECTORY


;!define MUI_PAGE_CUSTOMFUNCTION_SHOW ComponentsPage_Show ;어떤거 설치할건지 고르는 페이지

;!insertmacro MUI_PAGE_COMPONENTS


!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPage_Show ;인스톨 페이지

!insertmacro MUI_PAGE_INSTFILES


!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPage_Show ;종료 페이지

!insertmacro MUI_PAGE_FINISH


;**********************************************************************************

; Each MUI uninstall page must have a show function assigned. 언인스톨러파트



;!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.WelcomePage_Show

;!insertmacro MUI_UNPAGE_WELCOME


;!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.ConfirmPage_Show

;!insertmacro MUI_UNPAGE_CONFIRM


;!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.InstFilesPage_Show

;!insertmacro MUI_UNPAGE_INSTFILES


;!define MUI_PAGE_CUSTOMFUNCTION_SHOW un.FinishPage_Show

;!insertmacro MUI_UNPAGE_FINISH


;LangString SECTION_WRITE_UNINSTALLER ${LANG_ENGLISH} `This will write an uninstaller executable into the current installation directory. The uninstaller UI has also increased in size!`

;언인스톨러 사용할때 활성화 시켜줄것. Write uninstaller 섹션을 거쳐서 언인스톨러의 사이즈도 조정해줌.


;**********************************************************************************


!insertmacro MUI_LANGUAGE "KOREAN" ;한국어 UI 설정




;******************리사이징 기능 함수들**************************

;각각 해당 페이지의 사이즈 재설정해줌. 안쓰는 파트 있으면 삭제해도 무방함


Function myGUIInit ;인스톨러 사용시 필히 풀어둘것

  ${nsResize_Window} ${AddWidth} ${AddHeight}

FunctionEnd


Function WelcomePage_Show

  ${nsResize_WelcomePage} ${AddWidth} ${AddHeight}

FunctionEnd


;Function LicensePage_Show

;  ${nsResize_LicensePage} ${AddWidth} ${AddHeight}

;FunctionEnd


Function DirectoryPage_Show

  ${nsResize_DirectoryPage} ${AddWidth} ${AddHeight}

FunctionEnd


;Function ComponentsPage_Show

;  ${nsResize_ComponentsPage} ${AddWidth} ${AddHeight}

;FunctionEnd


Function InstFilesPage_Show

  ${nsResize_InstFilesPage} ${AddWidth} ${AddHeight}

FunctionEnd


Function FinishPage_Show

  ${nsResize_FinishPage} ${AddWidth} ${AddHeight}

FunctionEnd


;이하 언인스톨러 페이지 리사이징 함수들


;Function un.myGUIInit ;언인스톨러 쓸거면 이건 반드시 풀어둘것

;  ${nsResize_Window} ${AddWidth} ${AddHeight}

;FunctionEnd


;Function un.WelcomePage_Show

;  ${nsResize_WelcomePage} ${AddWidth} ${AddHeight}

;FunctionEnd


;Function un.ConfirmPage_Show

;  ${nsResize_ConfirmPage} ${AddWidth} ${AddHeight}

;FunctionEnd


;Function un.InstFilesPage_Show

;  ${nsResize_InstFilesPage} ${AddWidth} ${AddHeight}

;FunctionEnd


;Function un.FinishPage_Show

;  ${nsResize_FinishPage} ${AddWidth} ${AddHeight}

;FunctionEnd


;**********************************************************************************



Section "MainSection" SEC01

  SetOutPath "$INSTDIR"

  SetOverwrite ifnewer

  ;File "c:\path\to\file\AppMainExe.exe"

  ;CreateDirectory "$SMPROGRAMS\응용 프로그램"

  ;CreateShortCut "$SMPROGRAMS\응용 프로그램\응용 프로그램.lnk" "$INSTDIR\AppMainExe.exe"

  ;CreateShortCut "$DESKTOP\응용 프로그램.lnk" "$INSTDIR\AppMainExe.exe"

  ;File "c:\path\to\file\Example.file"

SectionEnd


;Section `Write uninstaller` SECTION_WRITE_UNINSTALLER

  ;SectionIn RO

  ;WriteUninstaller $INSTDIR\Uninstall.exe

  ;MessageBox MB_OK|MB_ICONINFORMATION `Wrote: $INSTDIR\Uninstall.exe`

;SectionEnd


;Section Uninstall

  ;Delete $INSTDIR\Uninstall.exe

;SectionEnd


;!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN

;!insertmacro MUI_DESCRIPTION_TEXT ${SECTION_WRITE_UNINSTALLER} $(SECTION_WRITE_UNINSTALLER)

;!insertmacro MUI_FUNCTION_DESCRIPTION_END

라지윈도 전문


; Script generated by the HM NIS Edit Script Wizard.


; HM NIS Edit Wizard helper defines

!define PRODUCT_NAME "응용 프로그램"

!define PRODUCT_VERSION "1.0"

!define PRODUCT_PUBLISHER "나의 회사, Inc."

!define PRODUCT_WEB_SITE "http://www.mycompany.com"

!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\AppMainExe.exe"


; MUI 1.67 compatible ------

!include MUI2.nsh ;반드시 MUI2여야함. 그냥 MUI는 안됨

!include nsResize.nsh


; MUI Settings

!define MUI_ABORTWARNING ;설치 취소시 물어보는 기능임

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

;!define MUI_WELCOMEFINISHPAGE_BITMAP_NOSTRETCH

;**********************************************************************************

; Increase the width and height by these units:

; 사이즈 설정. 뒤에 u는 안붙여도 됨. 다만 붙인거랑 안붙인건 사이즈 크기 차이가 있다.

setfont "굴림" 10

!define AddWidth 40

!define AddHeight 40


;**********************************************************************************

!define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit ;인스톨러 리사이징

;**********************************************************************************

; Each MUI install page must have a show function assigned. 인스톨러 파트.


!define MUI_PAGE_CUSTOMFUNCTION_SHOW WelcomePage_Show ;환영페이지

!insertmacro MUI_PAGE_WELCOME


!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPage_Show ;경로설정

!insertmacro MUI_PAGE_DIRECTORY


!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPage_Show ;인스톨 페이지

!insertmacro MUI_PAGE_INSTFILES


!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPage_Show ;종료 페이지

!insertmacro MUI_PAGE_FINISH


;**********************************************************************************


; Language files

!insertmacro MUI_LANGUAGE "Korean"


;******************리사이징 기능 함수들**************************

;각각 해당 페이지의 사이즈 재설정해줌. 안쓰는 파트 있으면 삭제해도 무방함


Function myGUIInit ;인스톨러 사용시 필히 풀어둘것

  ${nsResize_Window} ${AddWidth} ${AddHeight}

FunctionEnd


Function WelcomePage_Show

  ${nsResize_WelcomePage} ${AddWidth} ${AddHeight}

FunctionEnd


Function DirectoryPage_Show

  ${nsResize_DirectoryPage} ${AddWidth} ${AddHeight}

FunctionEnd


Function InstFilesPage_Show

  ${nsResize_InstFilesPage} ${AddWidth} ${AddHeight}

FunctionEnd


Function FinishPage_Show

  ${nsResize_FinishPage} ${AddWidth} ${AddHeight}

FunctionEnd


;**********************************************************************************


; MUI end ------


Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"

OutFile "Setup.exe"

InstallDir "$PROGRAMFILES\응용 프로그램"

ShowInstDetails show


Section "MainSection" SEC01

  SetOutPath "$INSTDIR"

  SetOverwrite ifnewer


SectionEnd


Section -Post

SectionEnd

냉무 라지윈도 전문


크기 조절하려면 심플하게

!define AddWidth 40

!define AddHeight 40

부분의 숫자 수정해주면 됩니다.


!include nsResize.nsh 써야 하는거랑

!include MUI2.nsh MUI가 아니라 MUI2인점 주의해주시고



(MUI.nsh 넣고 돌리면 이렇게 출력되버립니다.)


세부적인건 주석 달아놓은것들 참고하면 될겁니다.



출처: http://fogria.tistory.com/420 [포그리아의 무한공간]



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



출처: http://fogria.tistory.com/418



안녕하세요 포그리아입니다.
정말 오랫만에 쓰는 NSIS 관련 글이네요.
다름아니라 정말 간만에 어떻게 내가 접속하는날을 귀신같이 알아채고 질문이 올라와서 그에 대한 대답을 해드리고자 합니다.
컴퓨터 밀어버린 이후론 NSIS 설치도 안하고 있지만 뭐, 일단 아는 한도에서 성의껏 답해드리겠습니다.

답하기 전에 우선 질문부터 봅시다.


그렇군요.

한줄로 "경로 삭제가 안된다. 어떻게 하죠" 정도로 요약 가능 합니다.


Name "TEST"

OutFile "TEST.exe"

InstallDir "$APPDATA"

ShowInstDetails show


Section "MainSection" SEC01

SetOutPath "$INSTDIR"

SetOverWrite ifnewer

delete "$instdir\.minecraft\*.*"

RMdir "$instdir\.minecraft"

File "7za.exe"

File ".minecraft.7z"

nsexec::exec '$INSTDIR\7za.exe x "$instdir\.minecraft.7z"'

delete "7a.exe"

delete ".minecraft.7z"

SectionEnd


코드 파트만 빼놨습니다.


오류가 안난다면 코드 자체에 특별히 구조상 문제는 없는 듯하니, 삭제하는 코드(굵은 부분)에 문제가 있는 거겠지요.


그럼 여기서 NSIS 리퍼런스를 한번 살펴봅시다!

(http://nsis.sourceforge.net/Reference/RMDir)




해석합시다. 내용은 읽을만한 수준으로 적당히 의역(+주석)합니다.


[/r] [/REBOOTOK] directory_name

[/r] [/REBOOTOK] 경로명

RMDir의 사용법입니다. 앞의 [/r]과 [/REBOOTOK] 두개는 생략 가능하다는 의미지요.


Remove the specified directory (fully qualified path with no wildcards). Without /r, the directory will only be removed if it is completely empty. If /r is specified, the directory will be removed recursively, so all directories and files in the specified directory will be removed. If /REBOOTOK is specified, any file or directory which could not have been removed during the process will be removed on reboot -- if any file or directory will be removed on a reboot, the reboot flag will be set. The error flag is set if any file or directory cannot be removed.

특정 경로(와일드 카드1가 없는 완전한 경로일 때)를 지웁니다. /r 없이 사용하면 경로가 완전히 비어있을 경우에만 삭제합니다. /r 를 사용하면 경로는 재귀 삭제되어 경로 안에 있는 모든 경로2와 파일을 삭제합니다. 만약 /REBOOTOK 를 사용하면 삭제 불가능한 파일을 재부팅 후 삭제합니다. 재부팅 삭제시 리부트 플래그가 세팅되며, 에러 플래그는 경로가 삭제 불가능할 때 세팅됩니다.

삭제 플래그 관련 내용입니다. 여기가 문제군요.

RMDir $INSTDIR

RMDir $INSTDIR\data

RMDir /r /REBOOTOK $INSTDIR

RMDir /REBOOTOK $INSTDIR\DLLs

사용법 예시입니다.

Note that the current working directory can not be deleted. The current working directory is set by SetOutPath. For example, the following example will not delete the directory.

현재 사용중인 경로는 삭제할 수 없음을 유의하십시오. 현재 사용중인 경로는 SetOutPath로 설정할 수 있습니다. 아래처럼 작성하면 안된단 소리입니다.

SetOutPath $TEMP\dir

RMDir $TEMP\dir

이걸 작동하게 하려면 이런 식으로 짜야 합니다.

SetOutPath $TEMP\dir

SetOutPath $TEMP

RMDir $TEMP\dir

주의사항입니다.

Warning: using RMDir /r $INSTDIR in the uninstaller is not safe. Though it is unlikely, the user might select to install to the Program Files folder and so this command will wipe out the entire Program Files folder, including other programs that has nothing to do with the uninstaller. The user can also put other files but the program's files and would expect them to get deleted with the program. Solutions are available for easily uninstalling only files which were installed by the installer.

경고: 언인스톨러에 RMDir /r $INSTDIR 를 사용하면 위험할 수도 있습니다. 만약 사용자가 Program Files 폴더를 경로로 설정하면 진짜 Program Files를 날려버릴겁니다.

원하는 경로만 삭제하는 방법은 여기서 참고하십시오.

내용은 길지만 대부분 부가 설명이니 간단히 줄였습니다.




다른건 모르겠고 굵게 표시한 부분이 문제겠네요.

코드상 마인크래프트 폴더를 삭제하려고 하는데, RMDir 명령어는 그냥 쓰면 비어있을때만 삭제하고 마인크래프트 폴더는 당연히 안에 게임파일로 가득 차있습니다. 이래서야 삭제가 될 리가 없지요.


간단히

RMdir /r "$instdir\.minecraft"

이런 식으로 바꾸면 될것같습니다.


문제를 해결하는데 참고가 되었으면 좋겠네요.



출처: http://fogria.tistory.com/418 [포그리아의 무한공간]



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



출처 : https://osmanias.com/index.php?mid=training&document_srl=1141311



http://nsis.sourceforge.net/Main_Page


NSIS는 멀티라이센스 예제올려봅니다.


!include "MUI2.nsh"
!include "Sections.nsh"


Name "Multiple Licences" ;제목
OutFile "TwoLicenses-MUI2.exe"  ;실행파일이름
InstallDir "$PROGRAMFILES\TwoLicenses" ;설치폴더지정
RequestExecutionLevel user ;권한

!insertmacro MUI_PAGE_WELCOME ;시작화면
!insertmacro MUI_PAGE_LICENSE           "License_One.txt" ;다중라이센스 1번파일
!insertmacro MUI_PAGE_LICENSE           "License_Two.txt" ;다중라이센스 2번파일

;!define MUI_PAGE_CUSTOMFUNCTION_PRE ComponentsPage1Pre
!define MUI_PAGE_CUSTOMFUNCTION_PRE COMPONENTS_Pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW COMPONENTS_Pre
!insertmacro MUI_PAGE_COMPONENTS 
!define MUI_PAGE_CUSTOMFUNCTION_PRE DIRECTORY_Pre
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DIRECTORY_Pre
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_FINISH


Function COMPONENTS_Pre
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1006
  SendMessage $0 ${WM_SETTEXT} 0 'STR:설치하려는 구성요소 선택:'
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1021
  SendMessage $0 ${WM_SETTEXT} 0 'STR:이용약관'
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1022
  SendMessage $0 ${WM_SETTEXT} 0 'STR:프로그램을 원치 않으시면 해제하세요.'

  GetDlgItem $R0 $HWNDPARENT 1037
  SendMessage $R0 ${WM_SETTEXT} 0 "STR:구성 요소 선택"
  CreateFont $R1 "$(^Font)" "11" "600"

  GetDlgItem $R0 $HWNDPARENT 1038
  SendMessage $R0 ${WM_SETTEXT} 0 "STR:설치하고자 하는 구성 요소를 선택해 주세요.."
  CreateFont $R1 "$(^Font)" "$(^FontSize)" "500"
FunctionEnd


!insertmacro MUI_LANGUAGE "Korean" ; ID = 1042
!insertmacro MUI_LANGUAGE "English" ; ID = 1033
LicenseLangString license ${LANG_ENGLISH} "License_One.txt"
LicenseLangString license ${LANG_Korean} "License_Two.txt"


Section "Dummy1" SEC1
  ; do nothing
SectionEnd

Section "Dummy2" SEC2
  ; do nothing
SectionEnd


Function DIRECTORY_Pre
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1006
  SendMessage $0 ${WM_SETTEXT} 0 'STR:프로그램을 다음 폴더에 설치할 예정입니다. 계속 하시려면 "다음"을 눌러주십시오.'
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1033
  SendMessage $0 ${WM_SETTEXT} 0 'STR:라이센스'
 

${If} ${SectionIsSelected} ${SEC1}  ;1번라인 아래 (멀티라이센스)
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1034
  SendMessage $0 ${WM_SETTEXT} 0 'STR:Dummy1'
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1030
  SendMessage $0 ${WM_SETTEXT} 0 'STR:$PROGRAMFILES\Dummy1'
Goto LINE1_SEC1_SET
${Else}
Goto LINE1_SEC1_END
${EndIf}


LINE1_SEC1_END:  ; 2번라인 아래  (멀티라이센스)
${If} ${SectionIsSelected} ${SEC2}
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1034
  SendMessage $0 ${WM_SETTEXT} 0 'STR:Dummy2'
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1030
  SendMessage $0 ${WM_SETTEXT} 0 'STR:$PROGRAMFILES\Dummy2'
Goto LINE2_SEC2_SET
${Else}
${EndIf}


LINE1_SEC1_SET:
${If} ${SectionIsSelected} ${SEC2}
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1035
  SendMessage $0 ${WM_SETTEXT} 0 'STR:Dummy2'
  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1031
  SendMessage $0 ${WM_SETTEXT} 0 'STR:$PROGRAMFILES\Dummy2'
${Else}

${EndIf}
LINE2_SEC2_SET:
FunctionEnd


!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
  !insertmacro MUI_DESCRIPTION_TEXT ${SEC1} "멀티txt-1 테스트합니다."
   ClearErrors
   InitPluginsDir
   File /oname=$PLUGINSDIR\License_Two.txt "License_Two.txt"
   FileOpen $0 "$PLUGINSDIR\License_Two.txt" r
   IfErrors exit
   System::Call 'kernel32::GetFileSize(i r0, i 0) i .r1'
   IntOp $1 $1 + 1 ; for terminating zero
   System::Alloc $1
   Pop $2
   System::Call 'kernel32::ReadFile(i r0, i r2, i r1, *i .r3, i 0)'
   FileClose $0
   FindWindow $0 "#32770" "" $HWNDPARENT
   GetDlgItem $0 $0 1000
   SendMessage $0 ${EM_SETLIMITTEXT} $1 0
   SendMessage $0 ${WM_SETTEXT} 0 $2
   System::Free $2
   exit:


  !insertmacro MUI_DESCRIPTION_TEXT ${SEC2} "멀티txt-2 테스트합니다."
   ClearErrors
   InitPluginsDir
   File /oname=$PLUGINSDIR\License_One.txt "License_One.txt"
   FileOpen $0 "$PLUGINSDIR\License_One.txt" r
   IfErrors exit2
   System::Call 'kernel32::GetFileSize(i r0, i 0) i .r1'
   IntOp $1 $1 + 1 ; for terminating zero
   System::Alloc $1
   Pop $2
   System::Call 'kernel32::ReadFile(i r0, i r2, i r1, *i .r3, i 0)'
   FileClose $0
   FindWindow $0 "#32770" "" $HWNDPARENT
   GetDlgItem $0 $0 1000
   SendMessage $0 ${EM_SETLIMITTEXT} $1 0
   SendMessage $0 ${WM_SETTEXT} 0 $2
   System::Free $2
   exit2:

!insertmacro MUI_FUNCTION_DESCRIPTION_END



출처: http://202psj.tistory.com/1094 [알레폰드의 IT 이모저모]

'CMD BAT 인스톨' 카테고리의 다른 글

cmd 명령어  (0) 2018.11.04
[Win32] 레지스트리 읽기 / 쓰기  (0) 2018.02.23
NSIS 예문 파일  (0) 2018.02.07
NSIS 번외 - 레지스트리  (0) 2018.02.07
NSIS sample script.  (0) 2018.02.07