在perl中读取msi文件

时间:2017-11-14 01:18:35

标签: perl winapi windows-installer

我想读一个msi文件。我使用的是Win32 :: MSI :: HighLevel库,但是这个一直给我发送unf。

我的代码:

use strict;
use warnings FATAL => 'all';
use Win32::MSI::DB qw(Win32::MSI::DB::MSIDBOPEN_READONLY);
use Win32::MSI::HighLevel;
use Data::Dumper;
my $msi = Win32::MSI::HighLevel->new (-file => "Firefox.msi", -mode => $Win32::MSI::DB::MSIDBOPEN_READONLY) or die "error $!";
my $productCode = $msi->getProductCode;
my $product = $msi->getProduct;

print Dumper  $productCode;

$product返回': - '$productCode为undef。

我已经检查了Windows文件属性中msi文件的信息,并验证了里面的信息。我已尝试使用另一个msi文件的代码,我有同样的问题。

2 个答案:

答案 0 :(得分:0)

MSI文件的ProductCode位于MSI文件中名为Properties的表中,该表是关系数据库。它不是文件属性。这篇文章应该有所帮助:

PowerShell: Get the MSI product code out of a MSI file without installing?

因为它概述了需要进行的各种调用,基本上是打开数据库,使用SQL查询执行OpenView"" SELECT Value FROM属性WHERE Property =' ProductCode& #39;等等,在这里类似:

https://codereview.stackexchange.com/questions/143304/get-productcode-from-msi-file-using-dtf-in-c

答案 1 :(得分:0)

我找到了解决方案。我在“populateTable”函数中添加调用,因此代码为:

use strict;
use warnings FATAL => 'all';
use Win32::MSI::DB qw(Win32::MSI::DB::MSIDBOPEN_READONLY);
use Win32::MSI::HighLevel;
use Data::Dumper;
my $msi = Win32::MSI::HighLevel->new (-file => "Firefox.msi", -mode => $Win32::MSI::DB::MSIDBOPEN_READONLY) or die "error $!";
$msi->populateTable();
my $productCode = $msi->getProductCode;
my $product = $msi->getProduct;

print Dumper  $productCode;