2016-06-22 6 views
1

Ich versuche, bestimmte Werte aus einer MSI-Datei mit Powershell zu extrahieren, um die Installation zu automatisieren. Ich stieß auf eine Methode, die das Aufrufen von InvokeMember() wie example 1 und example 2 aufruft.Powershell - .GetType(). InvokeMember() löst Typenkonflikt aus Fehler

habe ich versucht, das selbst mit dem folgenden Code -

$windowsInstaller = New-Object -ComObject WindowsInstaller.Installer 
$mSIPath = $prereqComponent.getAttribute("msiFilename") 
$mSIDatabase = $windowsInstaller.GetType().InvokeMember(
    "OpenDatabase", 
    "InvokeMethod", 
    $null, 
    $windowsInstaller, 
    @($mSIPath.FullName, 0) 
) 

Jedes Mal, wenn ich die oben in Powershell v2.0 in Windows 7 SP1 ich folgende Fehlermeldung erhalten, laufen -

Ausnahme Aufruf „InvokeMember "mit "5" Argument (e): "Type Mismatch (Ausnahme von HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))." in Zeile 3 char: 56

  • $ mSIDatabase = $ windowsInstaller.GetType() InvokeMember < < < < ("Opendatabase", "InvokeMethod", $ null, $ Windows, @ ($ MSIPath, 0))

    • CategoryInfo. NotSpecified : (:) [], MethodInvocationException
    • FullyQualifiedErrorId: DotNetMethodTargetInvocation

Nachschlagen der error Ich dachte zuerst, dass es vielleicht bis msiFilename war, aber Test-Path $mSIPath Aufruf gibt True und es ist definitiv eine funktionierende MSI-Datei, wie ich es zuvor installiert habe.

Nach dem Versuch, die Argumente zu optimieren, bin ich ratlos. Könnte jemand vorschlagen, was ich falsch mache?

+1

Ich bin ein wenig durch die Verwendung von '$ mSIPath' abgeworfen. Ich glaube, Ihr Objekt sollte sein, dass 'mSIPath' vom Typ' IO.FileInfo' sein sollte - ist das genau? (__NOTE__: Ich frage das, weil '$ prereqComponent' im obigen Snippet nicht definiert ist, aber ich nehme an, dass es das ist, was es ist) – gravity

+1

Das ist absolut richtig. Der obige Code wurde von dem geändert, mit dem ich ursprünglich den Fehler hatte. Ich erkannte, dass der Grund, warum ich den Fehler zuerst bekam, dass aus irgendeinem Grund der vollständige Pfad falsch aufgelöst wurde, so dass PowerShell meine Datei nie gefunden hat. seit ich damit herumgespielt habe, habe ich statt des System.IO.Path-Objekts einen String-Pfad übergeben. Wenn Sie es als Antwort einreichen, werde ich es akzeptieren. Beide Probleme führen zur selben Fehlermeldung, so dass ich meinen zweiten Fehler nicht bemerkt habe. –

+0

Freut mich zu hören - nebenbei bemerkt, tolle Frage, viele gute Details und exzellent formatiert. – gravity

Antwort

1

Aus dem bereitgestellten Code-Snippet sieht es so aus, als ob Ihr vom Typ IO.FileInfo sein sollte.

Da wir nicht sehen können die $prereqComponent Objektklassifizierung, kann es sinnvoll sein, den vollständigen Pfadnamen (FQPN, wie zB: C:\Users\Me\Desktop\File) zuzuordnen, oder sicherstellen, dass die $msiPath oben IO.FileInfo Typ ist.