为什么从PowerShell函数返回类型总是一个数组?

时间:2014-09-26 22:54:48

标签: javascript jquery powershell scripting powershell-v3.0

我试图编写一个PowerShell函数来在网页上执行JavaScript / jQuery并将结果返回给PowerShell,我们使用setAttribute将这个JavaScript返回值存储在DOM中。然后使用getAttribute在PowerShell中检索它。但是,以下问题现在困扰我好几天了。请参阅下面的评论:

Function ExecJavaScript($ie, $jsCommand, [switch]$global)
{
    if (!$global) {
        $jsCommand = "document.body.setAttribute('PSResult', (function(){$jsCommand})());"
    }
    $document = $ie.document
    $window = $document.parentWindow
    $window.execScript($jsCommand, 'javascript')
    if (!$global) {
        $psresult = $document.body.getAttribute('PSResult')

        # Why no matter what I do, this always returns an array instead of a String?
        return $psresult.ToString()
        #return @($psresult)
        #return @($psresult).ToString()
        #return ($psresult | select -First 1)
        #return ($psresult -join '')
    }
}

$ie = New-Object -COM InternetExplorer.Application -Property @{
    Navigate = "https://www.google.com/"
    Visible = $true
}
do { Start-Sleep -m 100 } while ( $ie.busy )

$result = ExecJavaScript $ie @'
    return "JavaScript code ran successfully!";
'@

# Why $result.length is always 2 ?!!
$result.length
$result

谢谢!

1 个答案:

答案 0 :(得分:2)

本质上,返回null与返回null不同。 execScript方法返回null,实际上是一个输出到管道的对象。我希望下面的代码段解释您遇到的行为。

Function ReturnNull () {

    0..1 | % { $null }
}

Function ReturnToNull() {

    0..1 | % { $null | Out-Null }
}

# This will return 2.
(ReturnNull).length

# This will return 0 as it has been spit out to Null.
(ReturnToNull).length

当您添加ReturnNull cmdlet时,您的功能基本上为ReturnToNull并更改为Out-Null