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 プロパティがありますが、これは完全に牧草地に置かれています。確かに、かなりワイルドな推測です。

とにかく、正しい構文は、たとえば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 は null 参照を診断できないほど扱いません。次に、マシンでこの 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 に答える