Невозможно использовать IHTMLDocument2
$wc = New-Object System.Net.WebClient
$DownloadString = $wc.DownloadString("http://www.example.com")
$HTML = New-Object -ComObject "HTMLFile"
$HTML.IHTMLDocument2_write($DownloadString)
Серверный скрипт работает на
Major Minor Build Revision
----- ----- ----- --------
5 1 14409 1005
Разработка ПК
Major Minor Build Revision
----- ----- ----- --------
5 1 15063 502
Мой ПК для разработки под Windows 10 работал нормально с кодом выше. Я хочу запустить это на моем сервере Server 2008 R2 x64. Я обновил его до PowerShell v5. Я получаю следующее:
Ошибка вызова метода, поскольку [System.__ComObject] не содержит метод с именем 'IHTMLDocument2_write'.
А потом по линии...
Unable to find type [mshtml.HTMLDocumentClass].
2 ответа
Вопрос, который помог: не можете использовать объект InternetExplorer.Application?
Скопировал Microsoft.mshtml.dll с моего компьютера, который работал на сервер в C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies
, Потом добавил Add-Type -Path "C:\Program Files (x86)\Microsoft.NET\Primary Interop Assemblies\microsoft.mshtml.dll"
в начале моего сценария.
Я также заметил, что появляются некоторые окна безопасности IE (при запуске моего скрипта), и вполне возможно, что настройки безопасности IE сервера Windows будут мешать (будучи намного выше, чем клиент). Возможно, если бы мои настройки были понижены, это было бы решено без копирования.dll. Тем не менее, я думаю, что обновление до PSv5 было решающим (так как даже enum
не был признан).
Мой друг и я пытались решить эту проблему. Мы продолжали получать эту ошибку на его машине, в то время как тот же скрипт работал на моем (одна и та же версия Windows 10 на обоих).
Method invocation failed because [System.__ComObject] does not contain a method named 'IHTMLDocument2_write'.
At <script_path\script_name>:184 char:1
+ $HTML.IHTMLDocument2_write($content)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (IHTMLDocument2_write:String) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
Мы обнаружили, что на его компьютере объект $html имеет свойства ie9, а на моем - свойства IHTML. Он обнаружил, что на моем компьютере установлен MS Office, а на его - нет. Он попробовал код на другом из своих компьютеров под управлением Server 2008, на котором был установлен Office (даже старая версия, например 2010), и наш скрипт работал нормально.
Предложенное решение:
$HTML = New-Object -Com "HTMLFile"
try {
# This works in PowerShell with Office installed
$html.IHTMLDocument2_write($content)
}
catch {
# This works when Office is not installed
$src = [System.Text.Encoding]::Unicode.GetBytes($content)
$html.write($src)
}
Я не знаю почему, но после установки Microsoft Office на компьютере у меня все работает нормально. Пробовал на двух разных компьютерах.
У меня такая же проблема, и я смог ее исправить, загрузив файл dll из Интернета и зарегистрировав его в Powershell. Я нашел dll по адресу https://www.dllme.com/dll/files/microsoft_mshtml_dll.html с помощью поиска, но не уверен, что он официальный или нет. Затем я копирую его в папку System32 и запускаю две команды ниже.
Add-Type -Path "C:\Windows\System32\Microsoft.mshtml.dll"
Add-Type -AssemblyName "Microsoft.mshtml"
И голос ла, проблема ушла.