目前我无法为此找到原生 PHP 解决方案,因此我通过调用 Powershell 脚本暂时解决了这个问题,因为在那里看起来更容易做到。
我现在有这个 PHP 代码:
$version = exec("powershell.exe -file GetMsiVersion.ps1 MyFile.msi);
根据我上面的图片,$version 将包含1.5.9,所以我什至不需要解释来自 Subject 的数据。
GetMsiVersion.ps1 Powershell 脚本有这样的代码:
function Get-Property ($Object, $PropertyName, [object[]]$ArgumentList) {
return $Object.GetType().InvokeMember($PropertyName, 'Public, Instance, GetProperty', $null, $Object, $ArgumentList)
}
function Invoke-Method ($Object, $MethodName, $ArgumentList) {
return $Object.GetType().InvokeMember($MethodName, 'Public, Instance, InvokeMethod', $null, $Object, $ArgumentList)
}
$Path = $args[0]
$msiOpenDatabaseModeReadOnly = 0
$Installer = New-Object -ComObject WindowsInstaller.Installer
$Database = Invoke-Method $Installer OpenDatabase @($Path, $msiOpenDatabaseModeReadOnly)
$View = Invoke-Method $Database OpenView @("SELECT Value FROM Property WHERE Property='ProductVersion'")
Invoke-Method $View Execute
$Record = Invoke-Method $View Fetch
if ($Record) {
Write-Output (Get-Property $Record StringData 1)
}
Invoke-Method $View Close @()
我现在会接受这是最好的解决方案,但是,我希望这可以从 PHP 本地归档,因为我认为这是一个更好、更干净的解决方案 - 到那时我会接受它作为最佳答案(或者至少不接受我自己的临时解决方案)。
exec 有点邪恶 ;-)