在 Inno Setup 中检查 C: 盘中是否存在文件

问题描述 投票:0回答:1

我在这里找到的一些问题/解决方案类似,但不完全是我需要的。

我正在尝试为我为 Windows 创建的 Python 应用程序创建安装程序。安装程序调用另一个安装程序 (

openscad_installer.exe
),用户可以选择将其安装在他们喜欢的任何地方(即我不知道目的地并且需要能够找到它)或根本不安装它。

我本质上需要检查计算机上任何位置(在

openscad.exe
驱动器中)
C:
文件是否存在(即是否已安装)
,如果它不存在,那么我需要卸载我的软件。

卸载过程看起来很简单,但我不知道如何找出该文件是否存在。感谢您的帮助。

inno-setup pascalscript
1个回答
3
投票

C:
驱动器(也可能是任何其他驱动器,因为用户可能选择在其他任何地方安装软件)中搜索文件是可行的,但可能需要很长时间。

我建议您检查是否存在

SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD
注册表项:

const
  OpenSCADRegKey = 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD';

function PrepareToInstall(var NeedsRestart: Boolean): String;
var 
  ResultCode: integer;
begin
  Exec('OpenSCAD-xxx-Installer.exe', '', '', SW_SHOW, ewWaitUntilTerminated,
    ResultCode);

  if RegKeyExists(HKEY_CURRENT_USER_32, OpenSCADRegKey) or
     RegKeyExists(HKEY_CURRENT_USER_64, OpenSCADRegKey) or
     RegKeyExists(HKEY_LOCAL_MACHINE_32, OpenSCADRegKey) or
     RegKeyExists(HKEY_LOCAL_MACHINE_64, OpenSCADRegKey) then
  begin
    Log('OpenSCAD is installed');
  end
    else
  begin
    Log('OpenSCAD is not installed');
    // Abort installation
    Result := 'OpenSCAD is not installed';
    Exit;
  end;
end;

如果需要知道安装位置,请读取并解析

UninstallString
值:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenSCAD]
"UninstallString"="C:\\Program Files\\OpenSCAD\\Uninstall.exe"

如果您坚持搜索

openscad.exe
,请使用:

function FindFile(RootPath: string; FileName: string): string;
var
  FindRec: TFindRec;
  FilePath: string;
begin
  Log(Format('Searching %s for %s', [RootPath, FileName]));
  if FindFirst(RootPath + '\*', FindRec) then
  begin
    try
      repeat
        if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
        begin
          FilePath := RootPath + '\' + FindRec.Name;
          if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then
          begin
            Result := FindFile(FilePath, FileName);
            if Result <> '' then Exit;
          end
            else
          if CompareText(FindRec.Name, FileName) = 0 then
          begin
            Log(Format('Found %s', [FilePath]));
            Result := FilePath;
            Exit;
          end;
        end;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end
    else
  begin
    Log(Format('Failed to list %s', [RootPath]));
  end;
end;

另一个选项是在搜索路径中查找文件:
如何在Inno Setup中检查SQLCMD.EXE是否安装在客户端上

© www.soinside.com 2019 - 2024. All rights reserved.