首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Inno安装程序中获取msi文件版本

如何在Inno安装程序中获取msi文件版本
EN

Stack Overflow用户
提问于 2018-01-31 19:55:50
回答 1查看 585关注 0票数 2

我知道GetFileVersionGetStringFileInfo函数,但是它们不能处理*.msi文件.知道吗.?

代码语言:javascript
复制
#define AppVersion GetFileVersion("path\MyFile.msi")
#define AppVersion GetStringFileInfo("path\MyFile.msi", "FileVersion")

我要用它就像:

代码语言:javascript
复制
#define AppName "Google Chrome"
#define AppName2 "Google Chrome x86/x64"
#define AppVersion GetFileVersion("path\GoogleChromeStandaloneEnterprise.msi")
#define AppExe "chrome.exe"

[Setup]
AppName={#AppName}
AppVerName={#AppName2} v{#AppVersion}
AppVersion={#AppVersion}
VersionInfoVersion={#AppVersion}

我需要从GoogleChromeStandaloneEnterprise.msi文件中获得文件版本。

谢谢马丁,它很有魅力..。问候..。;-)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-03 07:57:43

您可以从从预处理器调用的WindowsInstaller.Installer中使用PowerShell:

代码语言:javascript
复制
#define GetMsiVersion(str FileName) \
  Local[4] = ExtractFileName(FileName), \
  Local[0] = AddBackslash(GetEnv("TEMP")) + Local[4] + ".ver", \
  Local[1] = \
    "-ExecutionPolicy Bypass -Command """ + \
    "Write-Host 'Retrieving version of MSI " + Local[4] + "'; " + \
    "$windowsInstaller = New-Object -com WindowsInstaller.Installer; " + \
    "$database = $windowsInstaller.GetType().InvokeMember('OpenDatabase', 'InvokeMethod', $Null, $windowsInstaller, @('" + FileName + "', 0)); " + \
    "$q = 'SELECT Value FROM Property WHERE Property = ''ProductVersion'''; " + \
    "$view = $database.GetType().InvokeMember('OpenView', 'InvokeMethod', $Null, $database, ($q)); " + \
    "$view.GetType().InvokeMember('Execute', 'InvokeMethod', $Null, $view, $Null); " + \
    "$record = $view.GetType().InvokeMember('Fetch', 'InvokeMethod', $Null, $view, $Null); " + \
    "$productVersion = $record.GetType().InvokeMember('StringData', 'GetProperty', $Null, $record, 1); " + \
    "$view.GetType().InvokeMember('Close', 'InvokeMethod', $Null, $view, $Null); " + \
    "Set-Content -Path '" + Local[0] + "' -Value $productVersion;" + \
    """", \
  Exec("powershell.exe", Local[1], SourcePath, , SW_HIDE), \
  Local[2] = FileOpen(Local[0]), \
  Local[3] = FileRead(Local[2]), \
  FileClose(Local[2]), \
  DeleteFileNow(Local[0]), \
  Local[3]

用它就像:

代码语言:javascript
复制
#define AppVersion GetMsiVersion("path\GoogleChromeStandaloneEnterprise.msi")

代码是基于How do I find the MSI product version number using PowerShell?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48550432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档