递归函数不正常工作?

时间:2018-01-08 09:50:46

标签: html powershell internet-explorer dom recursion

我创建了一个功能" Query-ComDomElements.ps1"查询HTML对象。

当仅查询一个对象并再次查询时,这非常有效。

当我尝试在递归中调用它时它却失败了,我不明白为什么。代码/对象是完全相同的。

有人可以告诉我为什么查询.container>img不起作用,但查询.containerimg是什么?

查询两者时(因此递归调用函数)得到的错误是:

Exception calling "InvokeMember" with "5" argument(s): "Unknown name. (Exception from HRESULT: 0x80020006 (DISP_E_UNKNOWNNAME))"
At C:\path\to\Query-ComDomElements.ps1:31 char:5
+ ...             $result = [System.__ComObject].InvokeMember("getElementsB ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : COMException

此处我的示例脚本(函数Query-ComDomElements.ps1未包含在github中):

. C:\path\to\Query-ComDomElements.ps1

$ie = New-Object -ComObject "InternetExplorer.Application"

$ie.Navigate2("https://www.gpunktschmitz.de/")

while($ie.Busy) {
    Start-Sleep -Seconds 1
}


#this works
$imgContainer = Query-ComDomElements -Query '.container' -Dom $ie.Document
$image = Query-ComDomElements -Query 'img' -Dom $imgContainer -Property 'src'

#this fails
$image = Query-ComDomElements -Query '.container>img' -Dom $ie.Document -Property 'src'

$ie.quit()

1 个答案:

答案 0 :(得分:2)

我认为问题正在发生,因为$dom在第二次迭代传入时最终成为一个包含两个元素的数组。一个(脏)修复就是使用Select-Object来获取第一个元素(建议使用Select而不是[0],这样如果它不是数组就不会出错) :

if($SecondQuery -eq $false) {
    if($Property -ne $false -and $Property -ne '*') {
        return $result.$Property
    } else {
        return $result
    }
} else {
    return Query-ComDomElements -Query $SecondQuery -Dom ($result | select -first 1) -Property $Property
}