【问题标题】:Powershell - .GetType().InvokeMember() throws Type mismatch ErrorPowershell - .GetType().InvokeMember() 抛出类型不匹配错误
【发布时间】:2016-10-24 14:29:49
【问题描述】:

我正在尝试使用 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 行 char:56

  • $mSIDatabase = $windowsInstaller.GetType().InvokeMember

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

查看error,我首先认为可能是msiFilename,但调用Test-Path $mSIPath 会得到True,它绝对是一个工作的.msi 文件,因为我之前已经安装了它。

在尝试调整论点后,我不知所措。谁能建议我做错了什么?

【问题讨论】:

  • 我对@9​​87654328@ 的使用有点失望。我相信您的对象应该是 mSIPath 应该是 IO.FileInfo 类型 - 这准确吗? (注意:我问这个是因为$prereqComponent 没有在上面的 sn-p 中定义,但我认为这就是它的意图)
  • 完全正确。上面的代码已经根据我最初遇到的错误进行了调整。我意识到我首先收到错误的原因是由于某种原因完整路径被错误地解析,因此 Powershell 从未找到我的文件。因为玩它,我传递了一个字符串路径而不是 System.IO.Path 对象。如果您将其作为答案提交,我将接受它。两个问题都会导致相同的错误消息,所以我没有注意到我的第二个错误。
  • 很高兴听到 - 顺便说一句,很好的问题写了,那里有很多很好的细节,而且格式很好。

标签: sql powershell windows-installer


【解决方案1】:

从提供的代码 sn-p 看来,您的 $msiPath 应该是 IO.FileInfo 类型。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多