2016-06-29 2 views
1

.getElementsByTagName()を使用してWebページから要素の配列を取得しています。次に、配列をループして、要素のタイトルを印刷します。PowerShell - .getElementsByTagName()によって返された配列の要素の属性を参照できません。

$links = $ie.document.GetElementsByTagName("a") 
Foreach($link in $links) 
{ 
    $link.title 
} 

これは機能します。しかし、forループは私のニーズに合っており、空白行だけを印刷するようです。

$links = $ie.document.GetElementsByTagName("a") 
for($i=0; $i -lt $links.length; $i++) 
{ 
    $links[$i].title 
} 

なぜ2番目のループはタイトルを印刷しませんか? title属性が欠落しているとき

+0

PowerGuiを使用して、両方のケースでオブジェクト$リンクを検査し、それらが同じタイプであることを確認して、PowerShellが何らかの形でそれらをキャストしていないことを確認します。 –

+1

可能な確認:http:// stackoverflow。 com/questions/17625309/use-getelementsbyclassname-in-a-script –

答えて

1

Select-Objectを除くすべての印刷以下の6つのメソッドすべてのリンクのタイトルは、また、空行を出力します。

$requestUri = "http://google.com" 

$ie = New-Object -ComObject "InternetExplorer.Application" 
$ie.Navigate($requestUri) 
while($ie.Busy) { Start-Sleep -Milliseconds 250 } 
$links = $ie.Document.getElementsByTagName("a") 

Write-Warning "ForEach-Object:" 
$links | ForEach-Object { $_.title } 

Write-Warning "Select-Object:" 
$links | Select-Object title 

Write-Warning "foreach:" 
foreach($link in $links) { $link.title } 

Write-Warning "for (from 0):" 
for($i = 0; $i -lt $links.Length; $i++) { 
    $links[$i].title 
} 

Write-Warning "for (from 1):" 
for($i = 1; $i -le $links.Length; $i++) { 
    $links[$i].title 
} 

Write-Warning "while:" 
$i = 0 
while($links[$i]) { 
    $links[$i].title 
    $i++ 
} 

$ie.Quit() 

あなたはあなたのシステム上でこれを実行しようとしていただけますか?

+0

ああ...私のために違いはありません... – Gerald

+1

右、私は私の答えを改訂しました。 – sodawillow

+0

出力:http://pastebin.com/2Nnz4vmT – Gerald

-1

$links = $ie.document.GetElementByTagName("a")と と$links = $varDiv.GetElementsByTagName("a")は、同じオブジェクトタイプを提供していないという点で同等です。

+0

おっと。それらは両方ともdiv内の要素のサブセットから取り除かれていますが、ここでは両方を編集して、質問の簡潔さのために文書全体から取り上げることを意図していました。編集されました。 – Gerald

関連する問題