2014-01-17 26 views
1

我想访问与Windows 2012的Internet Explorer COM对象的文档。该代码在Windows 2008中很好,但只要我尝试在Windows 2012上运行它(全新安装,在多台服务器上尝试),相同的代码停止工作。换句话说,$ ie.document.documentHtml返回为null。InternetExplorer.Application COM对象和Windows PowerShell中的2012年

下面是代码:

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

是否已经interexplorer COM对象在2012年窗口改变了吗?如果是,我该如何检索Windows 2012中的文档内容?

在此先感谢

编辑:增加了一个赏金,使事情变甜。 Invoke-WebRequest是很好的,但它只适用于Windows 2012,但我需要使用Internet Explorer,并在Windows 2008和Windows 2012上都能正常工作。我已经阅读了某处安装Microsoft Office的解决方案。这也不是一个选项。

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

+0

你是什么意思呢“停止工作?”你有错误信息吗?你期待什么结果,以及你收到什么结果?哪一行是失败的? –

+0

我的意思是代码不起作用。换句话说,$ ie.document.innerhtml是空的。有趣的是,我可以通过$ ie.visible = $ true使浏览器可见,它显示浏览器已导航到正确的页面,但我无法访问实际的页面内容 –

+0

从通过网络搜索,似乎我不是唯一有这个问题,似乎在某些情况下,安装Office 2010解决了这个问题 - 这不是我的选择 –

回答

3

这是一个知道是不是BUG:

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程序集到您的脚本的位置(可以是网络驱动器)
  2. 使用Load-Assembly.ps1脚本(代码如下: http://sdrv.ms/U6j7Wn)加载在存储器 例如组件类型:\负载Assembly.ps1 -Path \ microsoft.mshtml.dll

然后继续照常创建IE对象等警告:与处理时write()和writeln()方法使用向后兼容的方法:IHTMLDocument2_write()和IHTMLDocument2_writeln()。

+0

我没有投票,但由于我在多台机器上远程使用PowerShell,这是不实际的。谢谢 –

+0

虽然我本来希望有一个解决方案,不需要在多个文件上复制dll,但这个答案是最接近的,而且赏金即将过期 - 谢谢 –

+0

@YounElan欢迎您!感谢赏金! –

1

据我所知,在Windows Server 2012上获得一个页面的全部HTML:

$ie.document.documentElement.outerhtml 

还有一个innerhtml属性上documentElement,其剥去根<html>元件。

当然,如果你想要做的就是在原始标记,可以考虑使用Invoke-WebRequest

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

我打算写$ ie.document.documentElement.innerhtml - 它在2012年是空的。我会编辑我的帖子。 $ ie.document是System .__ ComObject,但输入$ ie.document.documentElement不会返回任何内容。有关Invoke-WebRequest的信息很有趣,所以我会投票,但不幸的是在我的情况下,我需要使用Internet Explorer。 –

2
$ie.document.documentHtml.innerhtml 

更大的问题是,这是如何能够工作。 Document属性返回对IHTMLDocument interface的引用,它没有“documentHtml”属性。当你使用后期绑定的时候,你可能会得到什么样的结果,这一点从来不清楚。有一个由DHTML编辑控件支持的旧documentHtml属性,它已被牢固地放置到the pasture。无可否认,这是一个疯狂的猜测。

安美居,正确的语法是使用,也就是说,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将治疗空引用而undiagnosably,然后尝试运行的计算机上此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(); 
    } 
} 
+0

在我的Windows 2012,既不$ ie.document.body也不$ ie.document.body.innerhtml可用。感谢 –

+0

这非常奇怪,IE对象模型已经存在了很长时间,并且在2012年没有什么不同。启动该机器上的Regedit.exe并导航到“HKCR \ InternetExplorer.Application”。引用您在那里看到的CLSID键值。并从其“帮助+关于”对话框中引用IE版本。 –

+0

我很感激帮助。 IE版本10.0.9200.16384和clsid是{0002DF01-0000-0000-C000-000000000046} –