2017-04-03 5 views
1

Ich versuche, einige Informationen aus einer MSI-Datei wie oder CustomAction zu extrahieren. Ich habe andere Skripte aus dem Internet verwendet und sie bearbeitet, aber mein Skript hat einige Probleme.Powershell Get MSI Informationen

Dies ist nur ein kleines Stück des ursprünglichen Codes ist, aber wenn ich diese ausführen, bekomme ich diese Fehlermeldung:

WARNUNG: Exception „InvokeMember“ mit „5“ Argumente (e) Aufruf: " Open View, Sql“

function Get-MSIFileInformationList { 
[CmdletBinding()] 
[OutputType([string])] 
param(
[parameter(Mandatory=$true, 
ValueFromPipeline=$true, 
ValueFromPipelineByPropertyName=$true)] 
[ValidateNotNullOrEmpty()] 
[System.IO.FileInfo]$Path, 

[parameter(Mandatory=$true)] 
[ValidateNotNullOrEmpty()] 
[string]$FROM = "Property", 

[parameter(Mandatory=$true)] 
[ValidateNotNullOrEmpty()] 
[string]$LIKE = "Property", 

[parameter(Mandatory=$true)] 
[ValidateNotNullOrEmpty()] 
[string]$WHERE = "Property", 

[parameter(Mandatory=$true)] 
[ValidateNotNullOrEmpty()] 
[string]$SELECT = "Property" 
) 

Begin 
{ 
} 
Process { 
    try { 
     # Read property from MSI database 
     $WindowsInstaller = New-Object -ComObject WindowsInstaller.Installer 
     $MSIDatabase = $WindowsInstaller.GetType().InvokeMember("OpenDatabase", "InvokeMethod", $null, $WindowsInstaller, @($Path.FullName, 0)) 
     $Query = "SELECT $SELECT FROM $FROM WHERE $WHERE LIKE '%$($LIKE)%'" 
     # $Query = "SELECT Value FROM CustomAction WHERE Action = '$($CustomAction)'" 
     Write-Host 1 
     $View = $MSIDatabase.GetType().InvokeMember("OpenView", "InvokeMethod", $null, $MSIDatabase, ($Query)) 
     Write-Host 2 
     $View.GetType().InvokeMember("Execute", "InvokeMethod", $null, $View, $null) | Out-Null 
     Write-Host 3 
     $Record = $View.GetType().InvokeMember("Fetch", "InvokeMethod", $null, $View, $null) 
     try { 
     Write-Host 4 
      $Value = $Record.GetType().InvokeMember("StringData", "GetProperty", $null, $Record, 1) 
      Write-Host 5 

      # Commit database and close view 
      $MSIDatabase.GetType().InvokeMember("Commit", "InvokeMethod", $null, $MSIDatabase, $null) | Out-Null 
      Write-Host 6 
      $View.GetType().InvokeMember("Close", "InvokeMethod", $null, $View, $null) | Out-Null 
      Write-Host 7 
      $MSIDatabase = $null 
      $View = $null 
     } catch { 
      $Value = "-" 
     } 
     # Return the value 

     return $Value 

    } 
    catch { 
     Write-Warning -Message $_.Exception.Message ; break 
     return "" 
    } 
} 
End { 
    # Run garbage collection and release ComObject  [System.Runtime.Interopservices.Marshal]::ReleaseComObject($WindowsInstaller) | Out-Null 
    [System.GC]::Collect() 
} 
} 
+1

Mit welchen Parametern führen Sie den Befehl aus? Es sieht so aus, als ob diese Zeile fehlschlägt: $ View = $ MSIDatabase.GetType(). InvokeMember ("OpenView", "InvokeMethod", $ null, $ MSIDatabase, ($ Query)) 'aber das könnte sein, weil' $ MSIDatabase' oder '$ Query' werden nicht korrekt ausgefüllt. –

+0

Rufen Sie [Installer.LastErrorRecord() '] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa369430 (v = vs.85) .aspx) auf, um detaillierte Fehlerinformationen zu erhalten. – zett42

Antwort

2

MSI-Datenbanken nicht unterstützt LIKE, da es nur eine Teilmenge der SQL-Sprache (https://msdn.microsoft.com/en-us/library/windows/desktop/aa372021.aspx) implementiert. Dies sollte funktionieren:

$Query = "SELECT $SELECT FROM $FROM WHERE $WHERE = 'ProductName'" 

Wenn Sie filtern müssen, würden Sie es auf den Ergebnissen von SELECT * FROM Property zu tun haben.

Verwandte Themen