2016-06-22 3 views
1

Я пытаюсь извлечь определенные значения из .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-файл, как я его установил ранее.

После попытки изменить аргументы я в недоумении. Может ли кто-нибудь предположить, что я делаю неправильно?

+1

Я немного отброшен с помощью '$ mSIPath'. Я считаю, что ваш объект должен состоять в том, что 'mSIPath' должен быть типа' IO.FileInfo' - это точно? (__NOTE__: Я прошу об этом, потому что '$ prereqComponent' не определен в приведенном выше фрагменте, но я предполагаю, что это то, что он предназначен) – gravity

+1

Это абсолютно правильно. Вышеупомянутый код был изменен из того, с чем я первоначально сталкивался с ошибкой. Я понял, что причина, по которой я получил ошибку, в первую очередь заключалась в том, что по какой-то причине полный путь был устранен некорректно, поэтому Powershell так и не нашел мой файл. поскольку я играл с ним, я передал строковый путь вместо объекта System.IO.Path. Если вы представите его в качестве ответа, я соглашусь с ним. Оба пробника приводят к одному и тому же сообщению об ошибке, поэтому я не заметил своей второй ошибки. –

+0

Рад услышать - между прочим, отличный вопрос, много хороших деталей там и отлично отформатировано. – gravity

ответ

1

Из предоставленного фрагмента кода, это выглядит так, как ваш $msiPath должен быть типа IO.FileInfo.

Поскольку мы не можем видеть классификацию $prereqComponent объекта, это может быть полезно назначить полное имя пути (FQPN, такие как: C:\Users\Me\Desktop\File), или обеспечить $msiPath выше типа IO.FileInfo.

Смежные вопросы