Powershell - .GetType()。InvokeMember()抛出类型不匹配错误

时间:2016-06-22 14:51:15

标签: sql powershell windows-installer

我正在尝试使用Powershell从.msi文件中提取某些值,以帮助自动执行安装。我遇到了一个涉及调用InvokeMember()的方法,例如example 1example 2

我自己尝试使用以下代码 -

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

每当我在Windows 7 SP1的Powershell v2.0中运行上述操作时,我都会收到以下错误 -

  

使用“5”参数调用“InvokeMember”的异常:“类型不匹配。   (HRESULT异常:0x80020005(DISP_E_TYPEMISMATCH))“在行:3字符:56

     
      
  • $ mSIDatabase = $ windowsInstaller.GetType()。InvokeMember<<<< (“OpenDatabase”,“InvokeMethod”,$ null,$ windowsInstaller,@($ mSIPath,   0))

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

查看error我首先想到的可能是msiFilename,但调用Test-Path $mSIPath会给True,这肯定是一个有效的.msi文件,因为我有之前安装过它。

在试图调整论点后,我不知所措。任何人都可以建议我做错了吗?

1 个答案:

答案 0 :(得分:1)

从提供的代码段看,$msiPath的类型应为IO.FileInfo

由于我们无法看到$prereqComponent对象分类,因此分配完全限定的路径名​​称(FQPN,例如:C:\Users\Me\Desktop\File)可能很有用,或者确保上面的$msiPath是类型为IO.FileInfo