2014-01-17 59 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} –