我试图编写一个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
谢谢!
答案 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
。