Установка Inno позволяет Вам установить переменные среды через [Реестр] разделы (путем установки ключа реестра, которые соответствуют переменной среды),
Однако иногда Вы только хотите установить переменную среды. Часто, Вы хотите изменить его. Например: на установку можно хотеть добавить/удалить каталог, to/from переменная окружения PATH.
Как я могу изменить переменную окружения PATH из InnoSetup?
Путь в указанном вами разделе реестра является значением типа REG_EXPAND_SZ
. Как указано в документации Inno Setup для раздела [Registry] , есть способ добавить к ним элементы:
В строке
,
expandsz
илиmultisz
значение типа, вы можете использовать в этом параметре специальную константу с именем{olddata}
.{olddata}
заменяется предыдущими данными значения реестра. Константа{olddata}
может быть полезна, если вам нужно добавить строку к существующему значению, например,{olddata}; {app}
. Если значение не существует или существующее значение не является строковым типом, константа{olddata}
автоматически удаляется.
Таким образом, чтобы добавить к пути раздел реестра, подобный этому:
[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"
, который добавит каталог «C: \ foo» к пути.
К сожалению, это может повториться при повторной установке, что также следует исправить.Параметр Check
с функцией, закодированной в сценарии Pascal, может использоваться для проверки того, действительно ли путь нужно расширять:
[Registry]
Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\foo"; \
Check: NeedsAddPath('C:\foo')
Эта функция считывает исходное значение пути и проверяет, содержится ли уже данный каталог в этом. Для этого он добавляет символы точки с запятой, которые используются для разделения каталогов в пути. Чтобы учесть тот факт, что искомый каталог может быть первым или последним элементом, символы точки с запятой также добавляются к исходному значению:
[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;
Обратите внимание, что вам может потребоваться раскрыть константы, прежде чем передавать их в качестве параметра для проверки подробности см. в документации.
Удаление этого каталога из пути во время деинсталляции может быть выполнено аналогичным образом и оставлено в качестве упражнения для читателя.