我正在尝试使用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年),我宁愿不手动复制文件
答案 0 :(得分:3)
变通方法的摘录:
所以,这是一个解决方法:
Microsoft.html.dll
(例如:从C:\ Program Files(x86)\ Microsoft.NET \ Primary Interop Assemblies到您脚本的位置(可以是网络驱动器)Load-Assembly.ps1
脚本(下面提供的代码,位于:http://sdrv.ms/U6j7Wn)将程序集类型加载到内存中
例如:。\ Load-Assembly.ps1 -Path。\ microsoft.mshtml.dll 然后像往常一样继续创建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
脚本有效。