2017-11-14 15 views
3

msi 파일을 읽고 싶습니다. 라이브러리 Win32 :: MSI :: HighLevel 사용하지만이 하나의 모든 시간을 undef 보냅니다.perl에서 msi 파일 읽기

내 코드 :

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은 미확정입니다.

Windows 파일 속성에서 msi 파일의 정보를 확인하고 정보가 내부에 있는지 확인했습니다. 다른 msi 파일을 사용하여 코드를 시도했지만 동일한 문제가 있습니다.

+0

파일 속성을 보면 해당 정보가 세부 정보에 표시됩니까? (필자는 그러한 탭과 것을 불리는 것을 기억하지 않고 Windows 컴퓨터에 액세스 할 수 없지만이 정보를 볼 수 있어야한다고 생각합니다.) 어쩌면 파일에서 정말 빠져있을 수도 있습니다. 다른 파일을 시도해보고 동일한 코드가 작동하는지 확인하십시오. – simbabque

+1

답변 해 주셔서 감사합니다. msi 파일의 정보를 읽으려고했는데 정보가 안에 있습니다. 나는 다른 msi 파일과 코드를 시도하고 동일한 문제가 있습니다. – Oneill

+1

나는 편집했다. 시간 내 줘서 고마워. – Oneill

답변

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; 
0

MSI 파일의 ProductCode는 관계형 데이터베이스 인 MSI 파일의 Properties라는 테이블에 있습니다. 파일 속성이 아닙니다. 이 게시물 도움이 될 것입니다

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

이 속성에서 값을 선택하여 데이터베이스를 열고 SQL 쿼리 ""과 오픈뷰를 할 기본적으로 있습니다 만들 필요가 다양한 호출을 설명하기 때문에 WHERE 속성 = 여기에 '제품 코드'등등과 유사한

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

+0

답변 해 주셔서 감사합니다. – Oneill