1

我正在尝试使用 Windows 2012 访问 Internet Explorer com 对象的文档。该代码在 Windows 2008 中运行良好,但一旦我尝试在 Windows 2012 上运行它(全新安装,在多个服务器上尝试),同样代码停止工作。换句话说,$ie.document.documentHtml 返回为 null。

下面是代码:

$ie = new-object -com "InternetExplorer.Application"
$ie.navigate2("http://www.example.com/") 
while($ie.busy) {start-sleep 1}
$ie.document.documentHtml.innerhtml

windows 2012 中的 interexplorer com 对象是否已更改?如果是,我如何在 Windows 2012 中检索文档内容?

提前致谢

编辑:添加了赏金以使事情变得甜美。Invoke-WebRequest 很好,但它只能在 Windows 2012 上运行,但我需要使用 Internet Explorer 并让它在 Windows 2008 和 Windows 2012 上运行。我在某处读过安装 microsoft office 解决了这个问题。这也不是一种选择。

edit2:由于我需要在多个 Windows 服务器(2008 和 2012)上远程调用脚本,我不希望手动复制文件

4

4 回答 4

3

这是一个已知的错误:http ://connect.microsoft.com/PowerShell/feedback/details/764756/powershell-v3-internetexplorer-application-issue

解决方法的摘录:

所以,这里有一个解决方法:

  1. Microsoft.html.dll从安装位置复制(例如:从 C:\Program Files(x86)\Microsoft.NET\Primary Interop Assemblies 复制到脚本的位置(可以是网络驱动器)
  2. 使用Load-Assembly.ps1脚本(下面提供的代码:http ://sdrv.ms/U6j7Wn )将程序集类型加载到内存中,例如:.\Load-Assembly.ps1 -Path .\microsoft.mshtml.dll

然后像往常一样继续创建 IE 对象等。警告:在处理 write() 和 writeln() 方法时,请使用向后兼容的方法:IHTMLDocument2_write() 和 IHTMLDocument2_writeln()。

于 2014-01-22T15:21:33.600 回答
2
    $ie.document.documentHtml.innerhtml

更大的问题是这怎么可能奏效。该Document属性返回对IHTMLDocument 接口的引用,它没有“documentHtml”属性。当您像在此代码中所做的那样使用后期绑定时,您可能会得到什么从来都不是很清楚。DHTML 编辑控件支持一个旧的 documentHtml 属性,该属性已被牢牢地投入使用。诚然,这是一个疯狂的猜测。

Anyhoo,正确的语法是使用body属性:

  $ie = new-object -com "InternetExplorer.Application"
  $ie.navigate2("http://www.example.com/") 
  while($ie.busy) {start-sleep 1}
  $txt = $ie.document.body.innerhtml
  Write-Output $txt

如果您仍然有问题,Powershell 确实无法识别地处理空引用,然后尝试在机器上运行此 C# 代码。应该给你一个更好的信息:

using System;

class Program {
    static void Main(string[] args) {
        try {
            var comType = Type.GetTypeFromProgID("InternetExplorer.Application");
            dynamic browser = Activator.CreateInstance(comType);
            browser.Navigate2("http://example.com");
            while (browser.Busy) System.Threading.Thread.Sleep(1);
            dynamic doc = browser.Document;
            Console.WriteLine(doc.Body.InnerHtml);
        }
        catch (Exception ex) {
            Console.WriteLine(ex.ToString());
        }
        Console.ReadLine();
    }
}
于 2014-01-22T18:00:57.283 回答
1

据我所知,在 Windows Server 2012 上获取页面的完整 html:

$ie.document.documentElement.outerhtml

上还有一个innerhtml属性documentElement,它会剥离根 <html>元素。

当然,如果您只想获取原始标记,请考虑使用Invoke-WebRequest

$doc = Invoke-WebRequest 'http://www.example.com'
$doc.Content
于 2014-01-18T05:31:27.807 回答
1

获取任何安装了 Office 的 PC,并将 Microsoft.mshtml.dll 复制到您的脚本位置。c:\program files (x86)\Microsoft.net\primary interop assembly\Microsoft.mshtml.dll

add-Type -Path Microsoft.mshtml.dll

脚本有效。

于 2020-09-16T05:22:05.500 回答