无法使用IHTMLDocument2

6
$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].

您可以通过 $HTML | Get-Member 命令来查看 $HTML 中的方法列表,具体请参考此文档 - Franklin Yu
4个回答

23

我和我的朋友一直在尝试解决这个问题。他的电脑一直出现错误,而相同的脚本在我的电脑上可以运行(两台电脑都安装了相同版本的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,但他的电脑没有安装。他在另一台安装了Office(即使是像2010这样的旧版本)的运行Server 2008的计算机上尝试了代码,我们的脚本可以正常工作。

建议解决方案:

$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)
}

1
与@TylerMontney的被接受的答案不同,这个解决方案在未安装Office以及在pwsh(PSVersion 6.2.0,PSEdition Core)中也可以工作。 - JosefZ

2

更新:

讽刺的是,多年后我遇到了类似的问题,看到这篇文章后想,“嘿,我曾经问过这个问题”。l0wm3mory的答案现在是正确的答案。

原文:

有用的问题:无法使用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安全框会出现(在运行我的脚本时),可能Windows服务器的IE安全设置会干扰(因为这比客户端更高)。也许如果我的设置降低了,就不需要复制dll了。但是,我认为升级到PSv5至关重要(因为连enum都没有被识别)。


0

我遇到了与上述相同的问题,并通过从互联网下载dll文件并在Powershell中注册它来解决它。 我通过搜索在https://www.dllme.com/dll/files/microsoft_mshtml_dll.html找到了这个dll,但不确定它是否官方。 然后我将它复制到System32文件夹中并运行下面的两个命令。

Add-Type -Path "C:\Windows\System32\Microsoft.mshtml.dll"
Add-Type -AssemblyName "Microsoft.mshtml"

同时语音的问题也已经解决了。


0

我不知道为什么,但在电脑上安装了微软办公软件后,一切都对我运转良好。这已经在两台不同的电脑上尝试过了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接