Miałem ten sam problem, ale pomimo powyższych odpowiedzi znalazłem rozwiązanie niestandardowe i chciałbym je udostępnić.
Przede wszystkim Utworzyłem plik environment.iss
z 2 metod - jedna za dodanie ścieżki do środowiska za Path zmienna i drugi, aby go usunąć:
[Code]
const EnvironmentKey = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment';
procedure EnvAddPath(Path: string);
var
Paths: string;
begin
{ Retrieve current path (use empty string if entry not exists) }
if not RegQueryStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths)
then Paths := '';
{ Skip if string already found in path }
if Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(Paths) + ';') > 0 then exit;
{ App string to the end of the path variable }
Paths := Paths + ';'+ Path +';'
{ Overwrite (or create if missing) path environment variable }
if RegWriteStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths)
then Log(Format('The [%s] added to PATH: [%s]', [Path, Paths]))
else Log(Format('Error while adding the [%s] to PATH: [%s]', [Path, Paths]));
end;
procedure EnvRemovePath(Path: string);
var
Paths: string;
P: Integer;
begin
{ Skip if registry entry not exists }
if not RegQueryStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths) then
exit;
{ Skip if string not found in path }
P := Pos(';' + Uppercase(Path) + ';', ';' + Uppercase(Paths) + ';');
if P = 0 then exit;
{ Update path variable }
Delete(Paths, P - 1, Length(Path) + 1);
{ Overwrite path environment variable }
if RegWriteStringValue(HKEY_LOCAL_MACHINE, EnvironmentKey, 'Path', Paths)
then Log(Format('The [%s] removed from PATH: [%s]', [Path, Paths]))
else Log(Format('Error while removing the [%s] from PATH: [%s]', [Path, Paths]));
end;
referencyjny: RegQueryStringValue
, RegWriteStringValue
Teraz w głównym pliku .iss mogę dołączyć ten plik i odsłuchać 2 zdarzenia (więcej o zdarzeniach, których można się dowiedzieć w sekcji Event Functions w dokumentacji), CurStepChanged
, aby dodać ścieżkę po instalacji i CurUninstallStepChanged
usunąć go, gdy użytkownik odinstaluje aplikację. W poniższym przykładzie skrypt dodaj/usuń katalog bin
(w stosunku do katalogu instalacyjnym):
#include "environment.iss"
[Setup]
ChangesEnvironment=true
; More options in setup section as well as other sections like Files, Components, Tasks...
[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall
then EnvAddPath(ExpandConstant('{app}') +'\bin');
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usPostUninstall
then EnvRemovePath(ExpandConstant('{app}') +'\bin');
end;
referencyjny: ExpandConstant
Uwaga nr 1: Instalacja krok dodać ścieżkę tylko raz (gwarantuje powtarzalność instalacji).
Uwaga # 2: Odinstaluj krok usuń tylko jedno wystąpienie ścieżki ze zmiennej.
Bonus: Krok instalacji z polem wyboru "Dodaj do zmiennej PATH".
Aby dodać kroku instalacji z wyboru „Dodaj do zmiennej PATH” zdefiniować nowe zadanie w [Tasks]
sekcji (domyślnie zaznaczone):
[Tasks]
Name: envPath; Description: "Add to PATH variable"
Następnie można sprawdzić w CurStepChanged
imprezy :
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) and IsTaskSelected('envPath')
then EnvAddPath(ExpandConstant('{app}') +'\bin');
end;
Czy nie byłoby wspaniale, gdybyś mógł po prostu przekazać '{olddata } 'do funkcji Check, aby nie trzeba było ponownie odczytywać wartości w kodzie? (może możesz - nie próbowałem);) –
Inną rzeczą jest to, że ścieżka może tam być, ale użyj innego znaku (łatwo naprawić za pomocą funkcji 'UpperCase' lub somesuch) lub, co gorsza, użyj nazw ścieżek 8.3 (np. "C: \ Progra ~ 1 \ MyProg") lub zmiennych środowiskowych (np. "% programfiles% \ MyProg"). Byłoby to koszmarem również do wykrycia tych ... –
a co, kiedy program zostanie odinstalowany? Jak usunąć ścieżkę ze zmiennej środowiskowej PATH? –