मुझे एक ही समस्या थी लेकिन ऊपर दिए गए उत्तरों के बावजूद मैंने एक कस्टम समाधान के साथ समाप्त कर दिया है और मैं इसे आपके साथ साझा करना चाहता हूं।
सब मैं 2 तरीकों के साथ environment.iss
फ़ाइल बना ली है सबसे पहले - पर्यावरण के पथ के लिए पथ को जोड़ने के लिए एक चर और दूसरा इसे हटाने के लिए:
[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;
संदर्भ: RegQueryStringValue
, RegWriteStringValue
अब मुख्य .iss फ़ाइल में मैं इस फ़ाइल को शामिल कर सकता हूं और 2 घटनाओं के बारे में सुन सकता हूं (प्रलेखन में Event Functions अनुभाग में उन घटनाओं के बारे में अधिक जानकारी), CurStepChanged
स्थापना के बाद पथ जोड़ने के लिए और CurUninstallStepChanged
उपयोगकर्ता को एप्लिकेशन को अनइंस्टॉल करते समय इसे निकालने के लिए।
#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;
संदर्भ:: ExpandConstant
नोट # 1: स्थापित करें कदम केवल एक बार पथ को जोड़ने (स्थापना के repeatability सुनिश्चित करता है में नीचे दिए गए उदाहरण स्क्रिप्ट जोड़ने/bin
निर्देशिका (स्थापना निर्देशिका के सापेक्ष) को हटा दें)।
नोट # 2: अनइंस्टॉल चरण चर से पथ की केवल एक घटना को हटा दें।
बोनस: चेकबॉक्स साथ स्थापना कदम "पथ चर में जोड़ें"।

चेकबॉक्स साथ स्थापना कदम को जोड़ने के लिए "पथ चर में जोड़ें"[Tasks]
खंड में नया कार्य को परिभाषित (डिफ़ॉल्ट रूप से चेक):
[Tasks]
Name: envPath; Description: "Add to PATH variable"
तो फिर तुम यह CurStepChanged
घटना में जांच कर सकते हैं :
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPostInstall) and IsTaskSelected('envPath')
then EnvAddPath(ExpandConstant('{app}') +'\bin');
end;
यदि आप बस {olddata 'पास कर सकते हैं तो यह अच्छा नहीं होगा } 'चेक फ़ंक्शन पर है ताकि आपको कोड में फिर से मूल्य को पढ़ने की आवश्यकता न हो? (शायद आप कर सकते हैं - मैंने कोशिश नहीं की है);) –
एक और बात यह है कि पथ वहां हो सकता है लेकिन एक अलग वर्ण केस का उपयोग करें (आसानी से 'अपरकेस' या somesuch फ़ंक्शन का उपयोग करके तय किया गया) या इससे भी बदतर, 8.3 पथ नामों का उपयोग करें (उदाहरण के लिए "सी: \ प्रोग्रा ~ 1 \ मायप्रोग") या पर्यावरण चर (उदाहरण के लिए "% प्रोग्रामफाइल% \ MyProg")। यह उन लोगों का पता लगाने के लिए एक दुःस्वप्न होगा ... –
आपके प्रोग्राम को अनइंस्टॉल करने के बारे में क्या होगा? आप पाथ पर्यावरण वैरिएबल से अपना रास्ता कैसे हटाएंगे? –