使用 Inno Setup 6.1 自动获取要下载的文件的 SHA256?

Automate obtaining the SHA256 for a file to download with Inno Setup 6.1?

DownloadTemporaryFile 的文档是这样描述 RequiredSHA256OfFile 参数的:

If RequiredSHA256OfFile is set it will compare this to the SHA-256 of the downloaded file and raise an exception if the hashes don't match.

An exception will be raised if there was an error. Otherwise, returns the number of bytes downloaded. Returns 0 if RequiredSHA256OfFile is set and the file was already downloaded.

根据回答here我确定获取校验和的正确命令行方法是:

CertUtil -hashfile MSAHelpDocumentationSetup.exe SHA256

这就是我将这个特定文件添加到我的脚本的方式:

AddFileForDownload('{#HelpDocSetupURL}', 'HelpDocSetup.exe');

扩展为:

procedure AddFileForDownload(Url, FileName: string);
begin
    DownloadPage.Add(Url, FileName, '');
    FilesToDownload := FilesToDownload + '      ' + ExtractFileName(FileName) + #13#10;
    Log('File to download: ' + Url);
end;

有没有自动化的方法:

  1. 正在获取我的文件的校验和。
  2. 将该校验和缓存到字符串中。
  3. 在构建脚本时使用该校验和值。

通过自动执行此任务,它将提供两个好处:

这在使用 Pascal 脚本的 Inno Setup 中可行吗?

Pascal 脚本帮不了你。您需要编译时的值。所以使用预处理器。你确实可以执行certutil。但是 imo,在这种情况下,使用 PowerShell 及其 Get-FileHash cmdlet:

更容易
#define GetSHA256OfFile(FileName) \
  Local[0] = AddBackslash(GetEnv("TEMP")) + "sha256.txt", \
  Local[1] = \
    "-ExecutionPolicy Unrestricted -Command """ + \
    "Set-Content -Path '" + Local[0] + "' -NoNewline -Value " + \
    "(Get-FileHash('" + FileName + "')).Hash" + \
    """", \
  Exec("powershell.exe", Local[1], SourcePath, , SW_HIDE), \
  Local[2] = FileOpen(Local[0]), \
  Local[3] = FileRead(Local[2]), \
  FileClose(Local[2]), \
  DeleteFileNow(Local[0]), \
  LowerCase(Local[3])

然后你可以像这样使用它:

AddFileForDownload(
  '{#HelpDocSetupURL}', 'HelpDocSetup.exe', '{#GetSHA256OfFile("HelpDocSetup.exe")}');

您当然需要将第三个参数添加到您的 AddFileForDownload 函数并将其传递给 TDownloadWizardPage.Add。您可能还需要添加文件路径,以便预处理器可以找到它。