2016-04-19 173 views
2

我有一個數組,$常規,我需要循環並點擊每次,這樣我可以保存在click()後可用的PDF。ForEach循環在PowerShell失敗後第一次迭代

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

這充滿$常規與我需要遍歷並點擊()每次4個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,每一個都需要點擊。 screenshot of $Conventional array

任何幫助真的不勝感激。謝謝大家

+1

'foreach(){}'有時候COM應用程序返回的集合有問題,因爲它們沒有正確實現'IEnumerable'。用'$ Conventional | ForEach-Object {$ _。InnerText}'來代替 –

+0

感謝您的迴應,現在就試試這個! – Quanda

+0

嗯,同樣的問題按照你的建議。在第一次迭代之後,Array是空的,沒有任何工作。當我刪除$ _click()它會工作並打印innerText,但我需要它與$ _click()一起工作。 Grrrr ... – Quanda

回答

1

既然它工作正常,除非你按下點擊,那麼點擊事件可能會改變文檔,足以打破$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) 
} 
+0

感謝您的回覆。我正在嘗試這個。 – Quanda

+1

這個效果非常好,非常感謝你 – Quanda

+0

出於好奇,是否有任何理由選擇使用'while'循環並將值從數組中彈出,而不是使用帶有計數器的For循環? – Quanda