簡體   English   中英

Inno Setup 使用來自父程序或批處理的環境變量值(不是來自注冊表的全局變量)

[英]Inno Setup Using environment variable values from parent program or batch (not global from registry)

總結:
我正在開發的程序不是安裝程序的傳統用途,實際上是標准的可執行文件,但 Inno Setup 是我擁有的唯一工具,到目前為止我已經使它適合各種用途。

當前試用 - 是刪除使用環境變量 ( PROG_USER ) 定位的特定文件。 這部分最初很好,如果在 Windows 中設置了變量,應用程序就可以正常工作。 我首先驗證變量已設置。 如果是這樣,它允許用戶繼續。

問題:
但問題就在這里。 我運行了許多測試環境,每個環境都從正在運行的應用程序中設置變量,通常我從該程序啟動的任何程序都會繼承這些變量。 但到目前為止 Inno Setup 總是嘗試解析注冊表。 有沒有辦法收集當前會話變量?

一個簡單的測試是在設置變量后從批處理或命令提示符執行程序,例如SET PROG_USER=c:\\testing\\version2\\user_files

然后啟動可執行文件,每次它都讓我知道變量未設置,即使我運行SET我可以看到此會話確實具有該值。 就像我說的那樣,也許這太過分了,但我已經看到了一些很好的答案,我希望為此找到一個。


更新:我想使用變量而不是注冊表中的變量。 例如PROG_USER=USER1 (在注冊表中)但是我將啟動安裝程序的應用程序設置了PROG_USER=USER20

我的代碼是這樣的:

procedure InitializeWizard;
var
  MsgResult: Integer;
  PROG: string;
begin
  PROG := GetEnv('PROG_USER');

  if PROG <> '' then
  begin
    MsgResult :=
      MsgBox('PROG_USER Path = ' + PROG +  #13#10 +'Do you wish to still proceed?',
        mbInformation, MB_YESNO);
    if MsgResult = IDYES then
    begin
      { user pressed Yes do rest of program }
    end
      else
    if MsgResult = IDNO then
    begin
      Abort;
    end
  end
    else
  begin
    MsgBox('PROG_USER variable is not set, this process will now exit!',
      mbInformation, MB_OK);
    
    Abort;
  end;      
end;

如果您想檢查和/或使用由 Windows 全局設置的環境變量,則此代碼很好(正如您所知,Windows 將這些存儲在注冊表中,這似乎是 Inno Setup 的外觀?)

我想要另一個應用程序使用的當前變量。 我正在從另一個程序啟動我的“設置”,而不是雙擊它。

正如我提到的,這可以通過一個調用setup.exe的簡單批處理文件來模擬。 通常,以這種方式調用的任何程序都會繼承該批次(或程序)中設置的變量,但我的 Inno Setup 不會。

當安裝程序被提升為管理員權限時,它會在不同的上下文中運行,因此它不會繼承父進程環境。

您有兩個選擇:

  • 如果安裝程序不需要管理員權限,請設置

    PrivilegesRequired=lowest

    然后安裝程序將作為一個普通程序運行,繼承父進程的環境。

  • 如果安裝程序確實需要管理員權限,請立即使用管理員權限運行父進程。 然后父進程和安裝程序將使用相同的上下文,並且環境也將被繼承。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM