[英]Delete (or do not create) Start menu shortcuts in Inno Setup when compiler flag is set
我有一個 Ant 腳本來編譯一個 Java 程序(我想分發的那個),創建幾個不同的可執行文件和設置文件(以運行不同的配置),然后啟動一個 Inno Setup 腳本以將它們全部放在一個安裝程序中。 Ant 腳本定義了許多屬性(主要是路徑名和文件名),它們作為常量傳遞給 Inno Setup 腳本。
我有一個用戶需要一個特殊的可執行文件。 與其維護兩個不同的 Ant 腳本,不如讓 Ant 腳本始終創建可執行文件。 但我還將屬性字段 ( fullJRE
) 設置為 0 或 1,具體取決於是否需要可執行文件。 該屬性作為常量傳遞給 Inno Setup,然后在 [code] 部分中用於在最后保留/刪除文件。 使用CurStep=ssPostInstall
從CurStepChanged
過程調用執行此操作的函數:
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
updateINI();
end
end;
function updateINI(): boolean;
begin
if ({#fullJRE} = 0) then
begin
DeleteFile(ExpandConstant('{app}\{#launcherName}.exe'));
end;
end;
但是在腳本的 Icons 部分創建了可執行文件的快捷方式,因為當運行 [icons] 時,該文件仍然存在。 基於fullJRE
常量,我要么需要同時保留文件和快捷方式,要么同時刪除它們。
有沒有辦法我可以:
Icons
部分添加“if”語句以防止創建某些圖標任何幫助,將不勝感激。 非常感謝!
您的fullJRE
“常量”實際上是一個預處理器變量。
您可以在任何預處理器指令中使用它來預處理您的 Inno Setup 腳本,使其看起來符合您的需要。
在這種情況下,您可以使用#if
指令:
[Icons]
#if fullJRE == "1"
Name: "{group}\My Program"
#endif
即使對於updateINI
代碼,您也應該這樣做。 您當前的方法會生成不必要的代碼,例如:
function updateINI(): boolean;
begin
if (1 = 0) then
begin
DeleteFile(ExpandConstant('{app}\{#launcherName}.exe'));
end;
end;
雖然您實際上可以通過執行以下操作使預處理器完全刪除該代碼:
#if fullJRE == "0"
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
updateINI();
end
end;
function updateINI(): boolean;
begin
DeleteFile(ExpandConstant('{app}\{#launcherName}.exe'));
end;
#endif
在 Inno Setup 腳本的最后添加一個SaveToFile
調用,看看預處理器生成了什么:
#expr SaveToFile(AddBackslash(SourcePath) + "Preprocessed.iss")
請參閱Inno Setup:如何查看 Inno Setup 預處理器的輸出(翻譯)?
順便說一句,在這種情況下,約定是定義一個“標志”,而不是一個帶有值的變量。
因此,不要使用/DfullJRE=1
, /DfullJRE
使用/DfullJRE
並使用#ifdef
和#ifndef
指令。
[Icons]
#ifdef fullJRE
Name: "{group}\My Program"
#endif
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.