我想读一个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文件的代码,我有同样的问题。
答案 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;