我正在尝试使用Powershell从.msi文件中提取某些值,以帮助自动执行安装。我遇到了一个涉及调用InvokeMember()的方法,例如example 1和example 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文件,因为我有之前安装过它。
在试图调整论点后,我不知所措。任何人都可以建议我做错了吗?
答案 0 :(得分:1)
从提供的代码段看,$msiPath
的类型应为IO.FileInfo
。
由于我们无法看到$prereqComponent
对象分类,因此分配完全限定的路径名称(FQPN,例如:C:\Users\Me\Desktop\File
)可能很有用,或者确保上面的$msiPath
是类型为IO.FileInfo
。