본문 바로가기

개발 관련

[inno setup] PATH 환경 변수 수정하기

[inno setup] PATH 환경 변수 수정하기

 

이노셋업에서 [Registry] 섹션에서 환경 변수를 설정할 수 있습니다.

 

이렇게...

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
    ValueType: expandsz; ValueName: "Path"; ValueData: C:\foo"

 

그런데 위의 셋업은 단순히 Path에 'C:\foo'를 설정하는 것이라서,

다른 환경 변수는 모두 사라지고 C:\foo만 남게 됩니다.

 

그래서 기존 데이터에 추가하고 싶으면 아래처럼,

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
    ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"

 

그런데 또 다른 문제가 있습니다.

셋업을 하면 할수록 계속 "C:\foo"가 추가 된다는 거죠

이때 'Check' 파라미터를 사용할 수 있습니다.

[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment";
    ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo";
    Check: NeedsAddPath('C:\foo')

 

NeedsAddPath는 함수 입니다.

[Code]

function NeedsAddPath(Param: string): boolean;
var
  OrigPath: string;
begin
  if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
    'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
    'Path', OrigPath)
  then begin
    Result := True;
    exit;
  end;
  // look for the path with leading and trailing semicolon
  // Pos() returns 0 if not found
  Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
end;

시스템 환경 변수의 값을 읽어와서 입력하려는 문자열과 비교하여 true/false를 리턴합니다.

 

그리고,

 {app}나, {userappdata}와 같은 변수로부터 실제 값을 얻어오려면, ExpandConstant( ) 함수를 사용하면 됩니다.

 

var
  Path : string
begin
    Path := ExpandConstant(Param)

 

마지막으로,

시스템 환경 변수와 사용자 환경 변수의 위치는  다음과 같습니다.

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 

HKEY_CURRENT_USER\Environment

 

입니다.

 

참고

1. http://stackoverflow.com/questions/3304463/how-do-i-modify-the-path-environment-variable-when-running-an-inno-setup-installe

2. http://www.jrsoftware.org/isfaq.php#env