Как я изменяю переменную окружения PATH при запуске Установщика Установки Inno?

Установка Inno позволяет Вам установить переменные среды через [Реестр] разделы (путем установки ключа реестра, которые соответствуют переменной среды),

Однако иногда Вы только хотите установить переменную среды. Часто, Вы хотите изменить его. Например: на установку можно хотеть добавить/удалить каталог, to/from переменная окружения PATH.

Как я могу изменить переменную окружения PATH из InnoSetup?

60
задан Alanight 12 January 2016 в 08:56
поделиться

1 ответ

Путь в указанном вами разделе реестра является значением типа 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;

Обратите внимание, что вам может потребоваться раскрыть константы, прежде чем передавать их в качестве параметра для проверки подробности см. в документации.

Удаление этого каталога из пути во время деинсталляции может быть выполнено аналогичным образом и оставлено в качестве упражнения для читателя.

77
ответ дан 24 November 2019 в 17:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: