1

的文档说明了DownloadTemporaryFile这个RequiredSHA256OfFile参数:

如果RequiredSHA256OfFile设置,它将与下载文件的 SHA-256 进行比较,如果哈希不匹配,则会引发异常。

如果出现错误,将引发异常。否则,返回下载的字节数。RequiredSHA256OfFile如果已设置且文件已下载,则返回 0 。

这里的答案中,我确定获取校验和的正确命令行方法是:

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 中是否可行?

4

1 回答 1

1

帕斯卡脚本不会帮助你。您在编译时需要该值。所以使用预处理器。您确实可以执行certutil. 但是 imo,在这种情况下,使用 PowerShell 及其Get-FileHashcmdlet更容易:

#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. 您可能还需要添加文件的路径,以便预处理器可以找到它。

于 2020-11-23T14:10:25.773 回答