如何用Inno Setup Pascal脚本检查系统是否安装Docker
需求说明
需要验证用户Windows系统是否已安装Docker:
- 若已安装,继续安装流程
- 若未安装,显示错误提示并终止安装
此前采用检查注册表的方式不准确,要求改为通过执行docker命令并验证输出来实现。
原注册表检查代码
function GetHKLM: Integer; begin if IsWin64 then Result := HKLM64 else Result := HKLM32; end; function GetHKU: Integer; begin if IsWin64 then Result := HKCU64 else Result := HKCU32; end; function InitializeSetup: Boolean; begin // Opening the setup installer initially Result := True; //if the docker is present in the machine registry return True else checking user registry if not RegKeyExists(GetHKLM, 'SOFTWARE\Docker Inc.') then begin if not RegKeyExists(GetHKU, 'Software\Docker Inc.') then begin // return False to prevent installation to continue Result := False; // Display that you need to install docker. SuppressibleMsgBox('<Docker not found!>', mbCriticalError, MB_OK, IDOK); end; end; end;
尝试的示例代码(待修正)
function checkdocker() :Boolean; var dockerfound: string; begin Result := ShellExecute(application.handle, 'docker', nil, nil, SW_MAXIMIZE) end; function InitializeSetup: Boolean; begin Result := True; if not checkdocker then; SuppressibleMsgBox('<Docker not found!>', mbCriticalError, MB_OK, IDOK); else #continue end;
正确实现代码
function CheckDockerInstalled: Boolean; var ExitCode: Integer; begin // 执行docker --version命令,隐藏窗口并等待执行完成 Result := Exec('docker.exe', '--version', '', SW_HIDE, ewWaitUntilTerminated, ExitCode); // 命令可执行且退出码为0,说明Docker已安装并在PATH中 Result := Result and (ExitCode = 0); end; function InitializeSetup: Boolean; begin Result := True; if not CheckDockerInstalled then begin Result := False; SuppressibleMsgBox('未找到Docker!请先安装Docker后再继续。', mbCriticalError, MB_OK, IDOK); end; end;
实现说明
- 用
Exec替代ShellExecute:Exec可以捕获命令的退出码,适合判断命令是否执行成功,而ShellExecute无法直接获取执行结果 - 选择
docker --version:这是轻量级检查,不会启动Docker守护进程,仅验证docker.exe是否存在且可用 - 返回
Result := False会直接终止安装流程,符合需求逻辑
内容的提问来源于stack exchange,提问作者Positive MA
相关产品推荐
相关产品推荐

