2017-11-14 1 views
3

Ich möchte eine MSI-Datei lesen. Ich benutze die Bibliothek Win32 :: MSI :: HighLevel, aber diese sendet mich undef die ganze Zeit.MSI-Datei in Perl lesen

Mein Code:

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; 

Die $product kehrt ': - ' und $productCode ist undefiniert.

Ich habe die Informationen der msi-Datei in den Windows-Dateieigenschaften überprüft und überprüft, dass die Informationen darin sind. Ich habe den Code mit einer anderen MSI-Datei ausprobiert und ich habe das gleiche Problem.

+0

Wenn Sie sich die Dateieigenschaften, zeigt es, dass Informationen in den Details? (Ich erinnere mich nicht, wie diese Tabs und Dinge heißen, und ich habe keinen Zugriff auf einen Windows-Rechner, aber ich denke, Sie sollten diese Informationen sehen können). Vielleicht fehlt es wirklich nur in der Datei. Probieren Sie eine andere Datei aus und prüfen Sie, ob derselbe Code funktioniert. – simbabque

+1

Danke für Ihre Antwort. Ich habe versucht, die Informationen von MSI-Datei zu lesen, und die Informationen sind darin. Ich habe den Code mit einer anderen MSI-Datei ausprobiert und ich habe das gleiche Problem. – Oneill

+1

Ich habe bearbeitet. Vielen Dank für Ihre Zeit. – Oneill

Antwort

0

ich finde die Lösung. Ich füge Anruf bei "populateTable" -Funktion, so der Code ist:

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

Der ProductCode einer MSI-Datei befindet sich in einer Tabelle namens Properties in der MSI-Datei, bei der es sich um eine relationale Datenbank handelt. Es ist keine Dateieigenschaft. Dieser Beitrag soll helfen:

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

, weil es die verschiedenen Anrufe umreißt, die gemacht werden müssen, die im Grunde sind die Datenbank zu öffnen, führen Sie eine Openview mit der SQL-Abfrage „“ SELECT Wert von Immobilien WHERE Eigenschaft = 'Productcode' und so weiter, und ähnliche hier:

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

+0

Danke für Ihre Antwort. – Oneill

Verwandte Themen