삽질도 두드려 보고,

DESIGN YOUR EXPERIENCE

코스 전체목록

닫기
본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

4.2 변수

 모든 변수는 전역 변수이며, 섹션이나 함수 안에서 사용될 수 있습니다. 기본적으로 변수의 이름은 1024자로 제한됩니다. 이 제한을 확장하기 위해서는 NSIS_MAX_STRLEN 값을 더 크게한 후 다시 build NSIS하거나 Special Builds를 사용하십시오.

4.2.1 사용자 변수

$VARNAME

 사용자 변수는 Var 명령을 통해 선언되어야 합니다. 이 변수들은 값을 저장하기 위해 사용되며, 문자열 조작 등의 작업에 이용합니다.

4.2.1.1 Var
[/GLOBAL] var_name

 사용자 변수를 선언합니다. 변수명에 사용될 수 있는 문자는 [a-z][A-Z][0-9] 및 '_' 입니다. 선언된 변수는 전역 변수입니다. (섹션이나 함수 안에서 선언되더라도) 이를 명확히 하기 위해, 섹션이나 함수 안에서의 변수 선언은 /GLOBAL 플래그를 사용해야 합니다. /GLOBAL 플래그는 섹션이나 함수 밖에서는 필요하지 않습니다.

Var example

Function testVar
  Var /GLOBAL example2

  StrCpy $example "example value"
  StrCpy $example2 "another example value"
FunctionEnd

4.2.2 기타 쓰기 가능한 변수

$0, $1, $2, $3, $4, $5, $6, $7, $8, $9

$R0, $R1, $R2, $R3, $R4, $R5, $R6, $R7, $R8, $R9

 레지스터입니다. 이 변수들은 사용자 변수처럼 사용될 수 있지만 대개 공유 함수나 매크로 안에서 사용됩니다. 이 변수들은 선언할 필요가 없으며 공유 코드 안에서 사용될 때 이름 충돌이 발생하지 않습니다. 공유 코드 안에서 이 변수들을 사용할 때 원본 값들을 저장하고 복원하기 위해 스택을 사용하는 것을 권장합니다.

 Win32 API 프로그래밍을 경험한 개발자의 경우, DC 오브젝트를 핸들링 과정과 비슷합니다.

 또한 플러그인 DLL에 의해 읽고 쓰일 수 있기 때문에 플러그인들 간의 통신에 사용될 수도 있습니다.

$INSTDIR

 설치 디렉터리입니다. (StrCpy, ReadRegStr, ReadINIStr 등을 사용하여 수정할 수 있습니다. 예를 들어 .onInit 함수에서 설치 위치의 고급 검색을 위해 사용될 수 있습니다.)

 언인스톨러 코드에서의 $INSTDIR는 언인스톨러 실행 파일이 위치하는 디렉터리로 지정됩니다. 인스톨러에서 사용된 값은 포함하지 않습니다. 예를 들어, 언인스톨러를 $WINDIR에 생성했고 사용자가 그것을 이동하지 않았다면 언인스톨러 실행 시 $INSTDIR 값은 $WINDIR가 됩니다. 그러므로 만약 언인스톨러를 프로그램 설치 위치가 아닌 다른 위치에 생성했다면, 인스톨러의 $INSTDIR 값을 레지스트리나 다른 저장 공간에 저장해서 언인스톨러가 그것을 읽어야 프로그램의 설치 위치를 찾을 수 있습니다.

$OUTDIR

 현재 출력 위치입니다. SetOutPath를 통해 암시적으로 설정되거나 StrCpy, ReadRegStr, ReadINIStr 등을 통해 명시적으로 설정됩니다.

$CMDLINE

 인스톨러의 명령줄 옵션입니다. 명령줄 포맷은 다음과 같습니다.

  • "full\path to\installer.exe" PARAMETER PARAMETER PARAMETER
  • installer.exe PARAMETER PARAMETER PARAMETER
  • PARAMETER 부분을 구문 분석하기 위해서는 GetParameters를 참조하십시오. /D=가 지정되었을 시(설치 디렉터리를 대체하기 위해) $CMDLINE에 저장되지 않습니다.

$LANGUAGE

 현재 사용되는 언어를 나타내는 식별자입니다. 예를 들어, 영어는 1033이며 한국어는 1042입니다. (LCID Dec)

 더 자세한 정보는 https://msdn.microsoft.com/en-us/library/cc233982.aspx를 참조하십시오.

 이 변수는 .onInit 함수 안에서만 수정할 수 있습니다.

4.2.3 상수

 상수는 InstallDir 속성에서  사용될 수 있습니다.

 새로운 상수 중 몇가지는 모든 OS에서 작동되지 않습니다. 예를 들어, $CDBURN_AREA는 Windows XP (Windows NT 5.1) 이상의 OS에서만 작동됩니다. 만약 Windows 98 등 하위 OS에서 사용된다면 빈값을 가집니다.

각 상수는 별도의 언급이 없는 한 모든 OS에서 사용 가능합니다.

$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64

 Program Files 디렉터리입니다. (대개 C:\Program Files 이지만 런타임에 플랫폼에 따라 설정됩니다.) 64비트 Windows에서는 $PROGRAMFILES 및 $PROGRAMFILES32는 C:\Program Files (x86)을 가리키며,$PROGRAMFILES64는 C:\Program Files를 가리킵니다. 64비트 응용 프로그램을 설치할 경우 $PROGRAMFILES64를 사용하십시오.

$COMMONFILES, $COMMONFILES32, $COMMONFILES64

 Common Files 디렉터리입니다. 이 디렉터리는 응용 프로그램 간에 공유되는 구성 요소들의 디렉터리입니다. (대개 C:\Program Files\Common Files 이지만 런타임에 플랫폼에 따라 설정됩니다.) 64비트 Windows에서는 $COMMONFILES 및 $COMMONFILES32는 C:\Program Files (x86)\Common Files을 가리키며, $COMMONFILES64는 C:\Program Files\Common Files를 가리킵니다. 64비트 응용 프로그램을 설치할 경우 $COMMONFILES64를 사용하십시오.

$DESKTOP

 바탕화면 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다. 일반적으로 C:\Documents and Settings\Administrator\Desktop (Windows NT 6.0 미만) 또는 C:\Users\Administrator\Desktop (Windows NT 6.0 이상)위치입니다.

$EXEDIR

 인스톨러 실행 파일이 위치하는 디렉터리입니다. (이 변수값을 수정할 수 있지만 권장하지 않습니다.)

$EXEFILE

 인스톨러 실행 파일의 기본 이름입니다.

$EXEPATH

 인스톨러 실행 파일의 전체 경로입니다.

${NSISDIR}

NSIS 설치 디렉터리의 경로를 갖는 기호입니다. NSIS 디렉터리 안의 아이콘이나 UI 리소스를 참조할 때 유용합니다.

 makensis와 데이터를 같은 위치에 저장(Windows에서 기본값)하면서 컴파일할 경우, makensis와 같은 위치입니다. 다른 플랫폼에서는 컴파일 타임에 설정됩니다. (INSTALL 파일을 참조하십시오.) 두 경우 모두 NSISDIR 환경 변수를 설정하므로써 런타임에 이를 수정할 수 있습니다. 더 자세한 정보는 section 3.1.3를 참조하십시오.

$WINDIR

 Windows 디렉터리입니다. (%windir%입니다. 대개 C:\Windows 또는 C:\WinNT 이지만 런타임에 플랫폼에 따라 설정됩니다.)

$SYSDIR

 Windows System 디렉터리입니다. (대개 C:\Windows\System 또는 C:\WinNT\System32 이지만 런타임에 플랫폼에 따라 설정됩니다.)

$TEMP

 임시 디렉터리입니다. 일반적으로 C:\Documents and Settings\Administrator\Local Settings\Temp (Windows NT 6.0 미만) 또는 C:\Users\Administrator\AppData\Local\Temp (Windows NT 6.0 이상)위치입니다. (%temp%)

$STARTMENU

 시작메뉴 폴더입니다. (CreateShortcut을 활용해 시작메뉴 항목을 추가할 때 유용합니다.) 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

$SMPROGRAMS

 시작메뉴->프로그램 폴더입니다. ($STARTMENU\Programs가 필요할 때 사용합니다.) 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

$SMSTARTUP

 시작메뉴->프로그램->시작프로그램 폴더입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

$QUICKLAUNCH

 Internet Explorer 4 active desktop 및 상위 버전을 위한 빠른실행 폴더입니다. $QUICKLAUNCH를 사용할 수 없는 플랫폼에서는 $TEMP와 동일한 값을 가집니다.

$DOCUMENTS

 문서 디렉터리입니다. 일반적으로 C:\Documents and Settings\Administrator\My Documents (Windows NT 6.0 미만) 또는 C:\Users\Administrator\Documents (Windows NT 6.0 이상)위치입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95에서는 사용할 수 없습니다.

$SENDTO

 보내기 메뉴의 바로가기 항목이 있는 디렉터리입니다.

$RECENT

 사용자의 최근 문서의 바로가기 항목이 있는 디렉터리입니다.

$FAVORITES

 사용자의 웹사이트 즐겨찾기, 문서 등의 바로가기 항목이 있는 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95에서는 사용할 수 없습니다.

$MUSIC

 사용자의 음악 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Windows XP, ME 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$PICTURES

 사용자의 사진 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Windows XP, ME 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$VIDEOS

 사용자의 동영상 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Windows XP, ME 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$NETHOOD

 네트워크 환경 폴더에 있는 링크 객체가 포함된 디렉터리입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95에서는 사용할 수 없습니다.

$FONTS

 Windows의 Fonts 디렉터리입니다.

$TEMPLATES

 문서 템플릿 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

$APPDATA

 응용 프로그램 데이터 디렉터리입니다. 현재 사용자 경로를 검색하려면 Internet Explorer 4 또는 그 이상의 버전이 필요합니다. 모든 사용자 경로를 검색하려면 Internet Explorer 5 또는 그 이상의 버전이 필요합니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95에서는 사용할 수 없습니다.

$LOCALAPPDATA

 로컬(논-로밍) 응용 프로그램 데이터 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Windows ME, 2000 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$PRINTHOOD

 장치 및 프린터 폴더에 있는 링크 객체가 포함된 디렉터리입니다.

 이 상수는 Windows 95 및 Windows 98에서는 사용할 수 없습니다.

$INTERNET_CACHE

 Internet Explorer의 임시 인터넷 파일 디렉터리입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95 및 Windows NT 4에서는 사용할 수 없습니다.

$COOKIES

 Internet Explorer의 쿠키 디렉터리입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95 및 Windows NT 4에서는 사용할 수 없습니다.

$HISTORY

 Internet Explorer의 기록 디렉터리입니다.

 이 상수는 Internet Explorer 4가 설치되지 않은 Windows 95 및 Windows NT 4에서는 사용할 수 없습니다.

$PROFILE

 사용자 프로필 디렉터리입니다. 일반적으로 C:\Documents and Settings\Administrator (Windows NT 6.0 미만) 또는 C:\Users\Administrator (Windows NT 6.0 이상)위치입니다.

 이 상수는 Windows 2000 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$ADMINTOOLS

 관리 도구가 보관되는 디렉터리입니다. 이 상수의 컨텍스트(모든 사용자 또는 현재 사용자)는 SetShellVarContext 설정에 따라 다릅니다. 기본값은 현재 사용자입니다.

 이 상수는 Windows ME, 2000 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$RESOURCES

 테마 및 다른 Windows 리소스를 저장하는 리소스 디렉터리입니다. (대개 $WINDIR\Resources 이지만 런타임에 플랫폼에 따라 설정됩니다.)

 이 상수는 Windows XP 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$RESOURCES_LOCALIZED

 로컬라이징된 테마 및 다른 Windows 리소스를 저장하는 리소스 디렉터리입니다. (대개 $WINDIR\Resources\1042 (한국어) 이지만 런타임에 플랫폼에 따라 설정됩니다.)

 이 상수는 Windows XP 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$CDBURN_AREA

 CD 굽기 대기 중인 파일이 저장된 디렉터리입니다.

 이 상수는 Windows XP 또는 그 이상의 Windows 버전에서 사용할 수 있습니다.

$HWNDPARENT

 메인 윈도우의 핸들값(HWND)입니다. (10진수)

$PLUGINSDIR

 플러그인 최초 사용 시 또는 InitPluginsDir 명령 호출 시 생성된 임시 폴더 경로입니다. 이 폴더는 인스톨러가 종료될 때 자동으로 삭제됩니다. 이것은 InstallOptions의 INI 파일, 스플래시 플러그인의 비트맵 리소스 파일 및 기타 플러그인의 동작에 필요한 파일들을 임시 저장하는데 적합한 폴더입니다.

4.2.4 문자열에 사용되는 상수

$$

 $를 표현하기 위해 사용합니다.

$\r

 캐리지 리턴을 표현하기 위해 사용합니다. (\r)

$\n

 개행을 표현하기 위해 사용합니다. (\n)

$\t

 탭을 표현하기 우해 사용합니다. (\t)

댓글

댓글 본문
  1. CraXicS
    안녕하세요.
    nsProcess 플러그인을 사용해보시겠어요? 몇몇 플러그인은 최신 OS 또는 64bit 프로세스를 제대로 지원하지 않는 듯 합니다.

    아래 코드는 스택에 저장된 4개의 프로세스명을 검색하여 차례대로 종료 여부를 묻는 코드입니다.
    nsProcess의 좀 더 자세한 예제는 아래 링크에서 플러그인을 다운로드 받으신 후 example 폴더를 참조해주세요.

    플러그인 설치 방법은 아래와 같습니다.
    1. nsProcess.nsh 헤더 파일을 {NSIS 설치 디렉터리}\Include 또는 !addincludedir 명령어를 통한 특정 위치를 지정한 후 해당 위치에 붙여 넣습니다.
    2. DLL 파일을 {NSIS 설치 디렉터리}\plugins 또는 !addplugindir 명령어를 통한 특정 위치를 지정한 후 해당 위치에 붙여 넣습니다. (접미사 W는 유니코드 용 DLL 이므로 "x86-unicode" 폴더에 넣습니다.

    !include "LogicLib.nsh"
    !include "nsProcess.nsh"

    OutFile "file_name.exe"
    ShowInstDetails show

    ; Kill 프로세스 목록
    Function .onInit
    push "excel.exe"
    push "mspaint.exe"
    push "notepad.exe"
    push "calc.exe"
    FunctionEnd

    Function "KillProc"
    ${For} $R4 1 4 ; Kill 프로세스 목록이 4개 이므로 4번 반복
    Pop $R0
    Var /GLOBAL ProcName
    StrCpy $ProcName $R0
    DetailPrint $R0
    ${nsProcess::FindProcess} $R0 $R1
    StrCmp $R1 0 0 _exit
    MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$ProcName가 현재 실행중입니다. 프로세스를 종료하고 설치를 진행하시겠습니까 ?" IDYES 0 IDNO _exit
    ${nsProcess::KillProcess} $ProcName $R2
    DetailPrint $R2
    _exit:
    ${Next}
    DetailPrint "KillProc 종료"
    FunctionEnd

    Section "section_name" section_index_output
    call KillProc
    SectionEnd

    ;http://nsis.sourceforge.net/NsProcess_plugin
    ;같은 이름의 모든 프로세스 종료
    ;프로세스 이름은 대소문자를 구분하지 않음
    ;Windows 6.1 커널까지 지원, 6.2, 6.3 및 10.0은 테스트 필요
    ;관리자 권한으로 실행되거나 다른 사용자로 전환되어 실행될 시 다른 사용자의 프로세스를 찾음.
    ;NSIS 유니코드 지원 (nsProcessW.dll)

    ;스택 자료구조를 배우신 분이라면 아시다시피 스택은 push 해서 넣고 pop해서 빼면 맨 위의 값부터 빠집니다. 고로 질문자님이 질문해주신 코드에서 반복문은 없고, pop은 한번만 하므로 맨 마지막에 push 된 프로세스만 검색해서 제거합니다.

    ; 또한 프로세스를 단순히 Kill 해버리면 해당 프로세스는 작업 데이터를 읽어버리게 되어 좋은 방법은 아닙니다. 예를 들어 엑셀 작업을 하고 있다가, 저장도 없이 프로세스가 종료되어 버리면 (물론 엑셀과 같이 견고한 프로그램은 자동 복구 옵션이 있지만) 작업 중이던 모든 자료가 날아갑니다. 고로 먼저 Kill을 하기 전에 해당 프로세스에게 종료 요청을 보낸다던지, 사용자에게 종료할 것을 권고하는 것이 우선되어야 합니다.
    대화보기
    • 궁금
      너무 어렵게 말씀한거같아서 다시올립니다 ㅠㅠ

      Var proc

      !macro KillProcessWhenFound un
      Function ${un}KillProcessWhenFound

      pop $R1

      StrCpy $proc $R1

      FindProcDLL::FindProc $R1

      IntCmp $R0 1 0 completed ;실행중일 경우 체크한다.

      StrCmp ${un} "" 0 uninstall
      MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "${PRODUCT_NAME}가 현재 실행중입니다. 프로세스를 종료하고 설치를 진행하시겠습니까 ?" IDYES +4
      Abort
      uninstall:
      MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "${PRODUCT_NAME}가 현재 실행중입니다. 프로세스를 종료하고 제거를 진행하시겠습니까 ?" IDYES +2
      Abort

      StrCpy $proc $R1

      ExecWait "TaskKill /F /IM $R1"

      Goto completed

      completed:
      FunctionEnd
      !macroend

      !insertmacro KillProcessWhenFound "un."
      -------------------------------------------------
      ;삭제부
      Function un.onInit
      push "EXCEL.EXE"
      push "Setup_Sc_Serive_TEST_1.0.0.0.exe"

      call un.KillProcessWhenFound
      FunctionEnd

      여기서 푸시가 마지막꺼만 되서 그럽니다 ㅠㅠ 마지막꺼만 종료 되고 위에 엑셀은 종료가 안됩니다..
      반복문 처럼 변수 하나로만 들어가도 돌아가는 구조가 되었으면 합니다..
    • 궁금.
      친절한 답변 감사합니다.
      몇가지 더 여쭤볼게 있습니다 ㅠㅠ
      제가 windows에서 돌아가는 exe파일을 지우는 로직을 짜고 있는데요..
      nsis에서 prockill이라는 플러그인을 쓰고 있습니다..
      그 부분은 정상적으로 돌아가는데..

      StrCpy $proc "exe1"
      StrCpy $proc "exe2"
      StrCpy $proc "exe3"

      이런식으로 하드코딩으로 들어가기에 수정도 되면서 저런식으로 반복되는 부분을

      StrCpy $proc $R0 이런 변수 하나만으로 처리를 하고 싶은데..


      !include "LogicLib.nsh"
      Function add
      ${For} $R5 $R6 $R10
      DetailPrint $R5
      ${Next}
      FunctionEnd

      Section call1
      call add
      StrCpy $R6 "exe"
      DetailPrint $R6
      StrCpy $R7 "exe1"
      DetailPrint $R7
      StrCpy $R8 "exe2"
      DetailPrint $R8
      SectionEnd
      이런식으로 쓰면 곤란할까요 ??
    • CraXicS
      OutFile "file_name.exe"
      ShowInstDetails show

      Var example

      Function testVar
      pop $R0
      StrCpy $example "example value"
      DetailPrint $example
      StrCpy $example $R0
      DetailPrint $example
      StrCpy $example "modified value 2"
      DetailPrint $example
      FunctionEnd

      Section "section_name" section_index_output
      DetailPrint $example ; 아직 선언되지 않았으므로 null 값을 출력합니다.
      push "modified value 1" ; 4.2.2 기타 쓰기 가능한 변수 참조
      call testVar
      StrCpy $example "modified value 3"
      DetailPrint $example
      SectionEnd

      ; NSIS 함수는 기본적으로 매개변수를 지원하지 않습니다. (매크로를 이용해서 매개변수를 붙힐 수 있습니다.)
      ; 그래서 스택 Push, Pop을 활용해 인수를 임시 저장해 전달하거나, 전역 변수인 점을 이용해 어디서든 example을 수정할 수 있습니다.
      ; 자세한 정보는 http://nsis.sourceforge.net......ion 를 참조하세요.
      대화보기
      • 궁금.
        Var example

        Function testVar
        Var /GLOBAL example2

        StrCpy $example "example value"
        StrCpy $example2 "another example value"
        FunctionEnd

        위에 있는 코드중에서요..
        저렇게 선언하고 call 했을때..
        갑자기 $example 부분의 "example value" 변경하고싶을때..

        call부분에서 바꿔줄수 잇는 부분이 있나요 ?? 저 변수 부분에서 그냥 수정하는게 아니라..
        엎어칠수 있는 부분에 대해서 질문드려봅니다..
      버전 관리
      Hyunseok Lim
      현재 버전
      선택 버전
      graphittie 자세히 보기