分享用于制作绿色单文件软件包的 inno setup 脚本

有时候我们需要这样的一个软件包:

  • 他是一个单文件
  • 他解压后可以直接启动软件
  • 他在关闭后可以自动删除临时文件

制作这样的软件包有很多种方法,下面分享的是使用 inno setup 打包工具制作这样的软件包的脚本。

; 功能: 制作用于临时使用的便携版本的软件包
; 说明:
; 一般情况下,只需要修改“define”开头的行的引号内的部分即可
; 生成的文件在当前文件夹内,文件名为: “软件名称_软件版本.exe”
; 作者: 杨永全
; 网址: https://www.qt06.com/

#define MyAppName "nvda远程被控端"
#define MyAppExeName "nvda.exe"
#define MyAppVersion "2022.3"
#define MyFileDir "nvda"
#define MyAppPublisher "我的公司"
#define MyAppURL "https://www.example.com/"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DisableWelcomePage=yes
DisableReadyPage=yes
DisableDirPage = yes
DisableProgramGroupPage = yes
DisableFinishedPage=yes
CloseApplications=no
;DefaultDirName={%tmp}\nvda{code:GenTempDir}
CreateAppDir=no
Uninstallable=no
;ArchitecturesInstallIn64BitMode=x64 ia64
; 如果不需要以管理员运行,请删除下一行开头的分号
;PrivilegesRequired=lowest
OutputDir=.
OutputBaseFilename={#MyAppName}_{#MyAppVersion}
; 为了加快解压速度,使用 zip方式压缩
; 如果想要更小的安装包体积,请把下一行末尾的“zip”替换为“lzma”
Compression=zip
; 如果想要更小的体积,请删除下一行开头的分号,但这会需要更多的解压时间
;SolidCompression=yes
WizardStyle=modern

[Languages]
Name: "chinesesimp"; MessagesFile: "compiler:Default.isl"

[Messages]
SetupAppTitle=
SetupWindowTitle=%1
WizardInstalling=正在启动
InstallingLabel=正在启动 [name] 请稍后。

[Files]
Source: "{#MyFileDir}\*"; DestDir: "{tmp}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Run]
FileName: "{tmp}\{#MyAppExeName}"; Description: "nvda"; Flags: shellexec hidewizard waituntilterminated

[Code]
const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

Procedure RestartDeleteDir(path: String);
var FindRec:TFindRec;
begin
if FindFirst(path+'\*',findrec) then
    try
          repeat
          if (not (findrec.name='.') and not (findrec.name='..')) then
                    if not findrec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                              RestartDeleteDir(path+'\'+findrec.name)
          else
   RestartReplace(path+'\'+findrec.name,'');
                                until not FindNext(FindRec);
                    finally
                    RestartReplace(path,'')
                          FindClose(FindRec);
                              end;
end;

function GenTempDir(Param: String): String;
begin
  Result := GetDateTimeString('yyyymmddhhnnss', '-', '-');
end;

procedure InitializeWizard();
begin
  PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
  PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var dataPath:string;
      begin
      dataPath:=ExpandConstant('{tmp}')
      if CurStep = ssDone then
begin
RestartDeleteDir(datapath)
end;                                          
end;
updatedupdated2022-12-312022-12-31