2009-03-04 72 views
2

該方案是我們有一個客戶端/服務器應用程序,客戶端安裝是使用Inno Setup從客戶端從IP /端口號指定的服務器下載客戶端的引導程序。我們希望能夠通過UDP廣播檢測本地網絡上是否有服務器,並且可以編寫一個控制檯應用程序來實現這一點。問題是,我們如何將控制檯應用程序的信息傳遞給安裝程序?從命令行將字符串值傳遞給Inno Setup應用程序

我可以捕獲返回代碼,但那隻能是int。據我所知,Inno Setup中唯一讀取文件的函數是在預處理程序中,所以我們無法讀取由控制檯應用程序在運行時創建的文件。我能想到的唯一的事情就是返回一個int,其中前4位數字是'。'和:在端口之前的位置,然後解析出這個值,這看起來像是hackish,flimsy和容易出錯的,尤其是考慮到我並不熟悉Inno Setup語法/構造字符串的函數。

有什麼建議嗎?

回答

3

不知道如何從命令行加載參數,但可以使用LoadStringFromFile加載文件的內容或GetIniString以從ini文件讀取參數。

更一般地,在Inno Setup幫助文件中查找「Support Functions Reference」。本頁面將給你所有Inno功能(不包括預處理器)的列表。如果你找不到這個頁面(如果你只能找到關於預處理器的信息),那麼你可能會看到錯誤的幫助文件。請注意,Inno Setup Help目錄並不是那麼好,但索引非常好。

命令行參數記錄在頁面「Setup Command Line Parameters」中。有可能你可以通過使用現有的參數來欺騙Inno,但是使用ini文件看起來好像是最直接的方法。

+0

在我安裝的版本中,至少它看起來像預處理器幫助被合併到主幫助文件中,儘管我記得它們在舊版Inno中是分開的,並且在搜索索引時很難分辨哪個是ISPP,而不是 – Davy8 2009-03-05 14:20:16

1

InnoSetup包含一個解釋的類似Pascal的擴展語言,它可以在安裝程序的運行時用於很多事情。

例如,我知道它可以讀取註冊表,我確信它可以讀取文件,至少從某些文件夾中讀取文件。您的控制檯模式應用程序可以編寫臨時文件或刪除一個或多個包含安裝程序其餘部分中所需信息的註冊表項,並且可以從腳本環境返回適當的安裝腳本。安裝程序甚至可以在稍後清理臨時文件和/或密鑰。

0

從創新安裝手冊:

{PARAM:PARAMNAME |默認值}

Embeds a command line parameter value. 
    * ParamName specifies the name of the command line parameter to read from. 
    * DefaultValue determines the string to embed if the specified command 
     line parameter does not exist, or its value could not be determined. 

實施例:

[配置] 的AppId = ... AppName的= {PARAM:exe_name | xyz} .exe

更多信息:www downloadatoz com/manual/in/inno-setup/topic_consts.htm

+0

這是爲了在啓動安裝過程時傳遞命令行參數。安裝程序執行一個命令行應用程序,需要將值返回到當前正在運行的安裝程序。 – Davy8 2009-05-20 18:37:57

4

如果您想從Inno Setup中的代碼解析命令行參數,請使用類似於此的方法。只需調用命令行安裝程序如下:

c:\MyInstallDirectory>MyInnoSetup.exe -myParam parameterValue 

然後你就可以調用GetCommandLineParam這樣無論你需要它:

myVariable := GetCommandLineParam('-myParam'); 
{ ================================================================== } 
{ Allows for standard command line parsing assuming a key/value organization } 

function GetCommandlineParam (inParam: String):String; 
var 
    LoopVar : Integer; 
    BreakLoop : Boolean; 
begin 
    { Init the variable to known values } 
    LoopVar :=0; 
    Result := ''; 
    BreakLoop := False; 

    { Loop through the passed in array to find the parameter } 
    while ((LoopVar < ParamCount) and 
     (not BreakLoop)) do 
    begin 
    { Determine if the looked for parameter is the next value } 
    if ((ParamStr(LoopVar) = inParam) and 
     ((LoopVar+1) < ParamCount)) then 
    begin 
     { Set the return result equal to the next command line parameter } 
     Result := ParamStr(LoopVar+1); 

     { Break the loop } 
     BreakLoop := True; 
    end 

    { Increment the loop variable } 
    LoopVar := LoopVar + 1; 
    end; 
end; 

希望這有助於..

+0

我認爲循環時代碼會丟失2'等號'符號。它應該閱讀: *而((LoopVar <= ParamCount)和(非BreakLoop))做 和 *而((LoopVar <= ParamCount)和(非BreakLoop))做 – 2016-01-11 12:15:02

0

上面的匿名答案應該是upvoted。

我能夠通過單指參數的名字在腳本中的參數傳遞給我的安裝程序:

{param:filePath|abc} 

,然後調用安裝使用所需格式傳遞參數值時:

MyInnoSetup.exe /filePath=../foo.exe 
相關問題