使用 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;
有没有自动化的方法:
- 正在获取我的文件的校验和。
- 将该校验和缓存到字符串中。
- 在构建脚本时使用该校验和值。
通过自动执行此任务,它将提供两个好处:
- 最大限度地减少复制/粘贴校验和值时的用户错误。
- 在没有用户交互的情况下保持校验和更新。
这在使用 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
。您可能还需要添加文件路径,以便预处理器可以找到它。
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;
有没有自动化的方法:
- 正在获取我的文件的校验和。
- 将该校验和缓存到字符串中。
- 在构建脚本时使用该校验和值。
通过自动执行此任务,它将提供两个好处:
- 最大限度地减少复制/粘贴校验和值时的用户错误。
- 在没有用户交互的情况下保持校验和更新。
这在使用 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
。您可能还需要添加文件路径,以便预处理器可以找到它。