PowerShell中的ForEach循环在第一次迭代后失败

时间:2016-04-19 13:50:21

标签: arrays powershell foreach

我有一个数组,$ Conventional,我需要循环并点击每次,以便我可以保存click()之后可用的PDF。

$Conventional = @()
$Conventional = $ie.Document.getElementsByTagName("td") | ? {($_.getAttributeNode('class').Value -match 'NodeDocument') -and ($_.innerText -notmatch 'Library Home')}

这填补了$ Conventional的四个td元素,我需要循环并点击()每次。以下是我的ForEach循环,它在第一次迭代时工作正常,然后失败并在每次返回System.ComObject之后。

ForEach ($i in $Conventional){

    $text = $i.innerText    

    $i.click()               
    while ($ie.Busy -eq $true){Start-Sleep -Seconds 2}

    $PDF = $ie.Document.getElementById("OurLibrary_LibTocUC_LandingPanel_libdocview1_DocViewDocMD1_hlViewDocument")

    $currentURL = $PDF.href
    $fileName = $baseFileName + "_" + $cleanText

    Invoke-WebRequest -Uri $currentURL -OutFile $NewPath\$fileName.pdf -WebSession $freedom
} 

这是我正在捕获的数组的屏幕截图。要检索PDF,需要单击每个PDF。 screenshot of $Conventional array

真的很感激任何帮助。谢谢大家

1 个答案:

答案 0 :(得分:1)

除非您按下click,否则它可以正常工作,那么click-event可能会更改Document以足以打破$Conventional - 数组中的元素参考。试试这种方法:

$linksToProcess = New-Object System.Collections.ArrayList

$ie.Document.getElementsByTagName("td") |
Where-Object {($_.getAttributeNode('class').Value -match 'NodeDocument') -and ($_.innerText -notmatch 'Library Home')} |
Foreach-Object { $linksToProcess.Add($_.innerText) }

while ($linksToProcess.Count -gt 0){

    $i = $ie.Document.getElementsByTagName("td") | ? {($_.getAttributeNode('class').Value -match 'NodeDocument') -and ($_.innerText -eq $linksToProcess[0])}

    $text = $i.innerText    

    $i.click()               
    while ($ie.Busy -eq $true){Start-Sleep -Seconds 2}

    $PDF = $ie.Document.getElementById("OurLibrary_LibTocUC_LandingPanel_libdocview1_DocViewDocMD1_hlViewDocument")

    $currentURL = $PDF.href
    $fileName = $baseFileName + "_" + $cleanText

    Invoke-WebRequest -Uri $currentURL -OutFile $NewPath\$fileName.pdf -WebSession $freedom

    $linksToProcess.RemoveAt(0)
}