Я пытаюсь извлечь определенные значения из .msi-файла с помощью Powershell, чтобы помочь автоматизировать установку. Я столкнулся с методом, вызывающим InvokeMember(), например example 1 и example 2.Powershell - .GetType(). InvokeMember() throws Ошибка несоответствия типа
Я попробовал это сам со следующим кодом -
$windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
$mSIPath = $prereqComponent.getAttribute("msiFilename")
$mSIDatabase = $windowsInstaller.GetType().InvokeMember(
"OpenDatabase",
"InvokeMethod",
$null,
$windowsInstaller,
@($mSIPath.FullName, 0)
)
Всякий раз, когда я бегу выше в Powershell v2.0 в Windows 7 SP1 я получаю следующее сообщение об ошибке -
Исключение призывающую «InvokeMember "с "5" аргумент (ы): "несоответствие типов (Исключение из HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))." В строке: 3: 56 полукокса
$ mSIDatabase = $ windowsInstaller.GetType() InvokeMember < < < < ("OpenDatabase", "InvokeMethod", $ нуль, $ WindowsInstaller, @ ($ mSIPath, 0))
- CategoryInfo:. NotSpecified : (:) [], MethodInvocationException
- FullyQualifiedErrorId: DotNetMethodTargetInvocation
Глядя вверх error Я сначала подумал, что, возможно, это было до msiFilename
, но при вызове Test-Path $mSIPath
дает True
, и это, безусловно, рабочий .msi-файл, как я его установил ранее.
После попытки изменить аргументы я в недоумении. Может ли кто-нибудь предположить, что я делаю неправильно?
Я немного отброшен с помощью '$ mSIPath'. Я считаю, что ваш объект должен состоять в том, что 'mSIPath' должен быть типа' IO.FileInfo' - это точно? (__NOTE__: Я прошу об этом, потому что '$ prereqComponent' не определен в приведенном выше фрагменте, но я предполагаю, что это то, что он предназначен) – gravity
Это абсолютно правильно. Вышеупомянутый код был изменен из того, с чем я первоначально сталкивался с ошибкой. Я понял, что причина, по которой я получил ошибку, в первую очередь заключалась в том, что по какой-то причине полный путь был устранен некорректно, поэтому Powershell так и не нашел мой файл. поскольку я играл с ним, я передал строковый путь вместо объекта System.IO.Path. Если вы представите его в качестве ответа, я соглашусь с ним. Оба пробника приводят к одному и тому же сообщению об ошибке, поэтому я не заметил своей второй ошибки. –
Рад услышать - между прочим, отличный вопрос, много хороших деталей там и отлично отформатировано. – gravity