Inno Setup是個滿好用的安裝檔製作程式

他也有Script Wizard讓你可以快速上手,不過Wizard中只有處理安裝(Install)相關內容

以下筆記解除安裝(Uninstall)相關常用內容

Note:
; 分號開頭是Inno Setup Script的註解標準寫法,// 雙斜線也是註解寫法

 

  • 移除時執行 [UninstallRun]

example:

[UninstallRun]
; 若程式執行中時可於此call cmd line關閉執行中程式, 避免檔案lock住無法移除
Filename: "{cmd}"; Parameters: "/C ""taskkill /f /im {#MyAppExeName}"

 

  • 移除時刪除檔案/資料夾 [UninstallDelete]

example:

[UninstallDelete]
; 預設的Uninstall只會移除安裝的內容, 程式執行時產生的檔案與資料夾則不處理, 可利用這裡刪除
; 它會按順序執行, 所以要移除最外層資料夾要放在最後動作
; Type分為三種, files => 移除檔案, filesandordirs => 移除資料夾含裡面所有檔案資料夾, dirifempty => 如果是空資料夾才移除

Type: files; Name: "{app}\sql.DB"
Type: filesandordirs; Name: "{app}\logs"
Type: dirifempty; Name: {app}

 

 

由於我的需求是移除時要彈出詢問視窗,看使用者是否要保留資料與設定
若不保留就安心的砍乾淨,要保留的話一個都不能亂砍
上面的[UninstallRun]與[UninstallDelete]都是必定執行,不符我的需求
這時就要求助[Code]來處理了
Code很強大,不只可以處理Uninstall,需要的請參考官方文件
我就筆記我的sample script code

  • 自訂程式 [Code]

example:

[Code]
procedure InitializeUninstallProgressForm();
    var ResultCode: integer;
    begin
        // 因為程式會不斷產生log, 所以中止寫在UninstallRun可能發生log沒被砍乾淨的問題, 寫在InitializeUninstallProgressForm則不會有問題
        Exec(ExpandConstant('{cmd}'), '/C ""taskkill /f /im {#MyAppExeName}"', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
        Exec(ExpandConstant('{cmd}'), '/C ""taskkill /f /im daemon.exe', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
        // 彈出視窗寫法
        if MsgBox('Do you also want to remove the user data?(database,settings,images)',mbConfirmation, MB_YESNO) = IDYES then
        begin
            // 可以執行batch檔, 可帶入引數
            Exec(ExpandConstant('{app}\uninstall.bat'), 'SureToRemoveData', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
        end
    end;

另外也可以在Code中撰寫batch或script,避免remove的batch被誤觸

var scrpt_rem_bat: String;
// Chr(10)是Pascal Scripting的換行符號
scrpt_rem_bat:= '@echo off' +Chr(10)+
                           'DEL /F /A /Q *.cfg' +Chr(10)
SaveStringToFile(ExpandConstant('{tmp}\remove_cfg.bat'), scrpt_rem_bat , False);
Exec(ExpandConstant('{tmp}\remove_cfg.bat'), '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);

 

以上是我初次接觸研究出來的寫法,如果大大們有更好更簡潔的處理方式也請跟我說哦!

 

arrow
arrow

    Milexz 發表在 痞客邦 留言(0) 人氣()