代码之家  ›  专栏  ›  技术社区  ›  Guenther Schmitz

递归函数工作不正常?

  •  1
  • Guenther Schmitz  · 技术社区  · 7 年前

    我创建了一个函数“ Query-ComDomElements.ps1 “”来查询HTML对象。

    当只查询一个对象并再次查询该对象时,这种方法非常有效。

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

    谁能告诉我为什么这个问题 .container>img 不工作,但正在查询 .container 还有这个 img

    查询两者(从而递归调用函数)时出现的错误是:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Matt    7 年前

    我认为问题的出现是因为 $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
    }