在PowerShell中使用InternetExplorer.Application com对象和Windows 2012

时间:2014-01-17 22:27:20

标签: powershell com internet-explorer-10 createobject

我正在尝试使用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

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

提前致谢

编辑:添加赏金以增加甜味。 Invoke-WebRequest很不错,但它只能在Windows 2012上运行,但我需要使用Internet Explorer并让它在Windows 2008和Windows 2012上都能正常工作。我已经阅读过安装microsoft office解决问题的地方。它也不是一种选择。

edit2:因为我需要远程调用多个Windows服务器上的脚本(2008年和2012年),我宁愿不手动复制文件

4 个答案:

答案 0 :(得分: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
  3. 然后像往常一样继续创建IE对象等。警告:当处理write()和writeln()方法时,使用向后兼容的方法:IHTMLDocument2_write()和IHTMLDocument2_writeln()。

答案 1 :(得分:2)

    $ie.document.documentHtml.innerhtml

更大的问题是这怎么可能有效。 Document属性返回对IHTMLDocument interface的引用,它没有“documentHtml”属性。在使用后期绑定时,如果在此代码中执行此操作,您可能会得到的内容永远不会清楚。 DHTML编辑控件支持旧的documentHtml属性,该属性已牢固地放到the pasture。不可否认,这是一个疯狂的猜测。

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();
    }
}

答案 2 :(得分:1)

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

$ie.document.documentElement.outerhtml

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

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

$doc = Invoke-WebRequest 'http://www.example.com'
$doc.Content

答案 3 :(得分:1)

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

添加类型-Path Microsoft.mshtml.dll

脚本有效。