这是我观察到的非常奇怪的行为。当网页中只有以下内容时,Invoke-WebRequest将发出警报消息并暂停所有脚本,直到警报被取消。
<script>
alert('testing');
</script>
我在网上找到了一个例子,所以你们都可以轻松复制。
Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
这是最奇怪的一点。我已经尝试了很多以避免这种警报。在我的情况下,-UseBasicParsing
不是一个选项。因此,我尝试将对象分配给变量,并仅访问没有提及警报的部分。例如:
$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
但这仍然会生成警报消息!甚至$null = $x.Forms
或类似的技巧都不能阻止它。
更奇怪的是,这只返回一次。例如:
$x = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
$x.Forms
$x.Forms
返回单个邮件。只有当我重新调用请求时,才会收到其他错误。
我也试过在一份工作中运行它,但这仍然会产生警报。这项工作暂停,直至被解雇。
有没有人知道如何在不使用-UseBasicParsing
参数的情况下解决此问题?
答案 0 :(得分:2)
通过-UseBasicParsing
拨打电话
$Request = Invoke-WebRequest 'http://activelab.io/code-snippets/show-alert-box-on-page-load' -UseBasicParsing
* EDIT:我知道您说过您不能使用-UseBasicParsing
,但是这里的要点是您不必实现自己的解析。您可以在修改响应以避免警报之前使用与Invoke-WebRequest相同的解析。这样,您就可以$request.forms
进行填充而不会发出任何警报。
修改响应HTML以覆盖警报弹出窗口。
$JavascriptAlertOverride = @"
// Override window.alert
window.alert = function() {
// do nothing here
};
// Override alert
alert = function() {
// do nothing here
};
"@
$NonAlertingHTML = $Request.Content -replace "<head>", "<head><script type='text/javascript'>$JavascriptAlertOverride</script>"
然后将其解析回完整的IHTMLDocument,您将可以立即访问.forms
以及Invoke-WebRequest上的其他任何属性,除非您没有警报。
$HTML = New-Object -ComObject "HTMLFile"
$HTML.IHTMLDocument2_write($NonAlertingHTML)
$HTML.forms
PS > $HTML.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False HTMLDocumentClass System.__ComObject
PS > $Request.ParsedHtml.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False HTMLDocumentClass System.__ComObject
答案 1 :(得分:0)
'https://www.quackit.com/javascript/javascript_alert_box_example_2.cfm'
处的SSL出现问题。我得到了:
Invoke-WebRequest : The underlying connection was closed: An unexpected error occurred on a send.
At line:1 char:1
+ Invoke-WebRequest -uri 'https://www.quackit.com/javascript/javascript_alert_box_ ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand
我必须将其更改为:'https://64.73.217.183/javascript/javascript_alert_box_example_2.cfm'
,然后才能在PS 4.x中对其进行测试。
这个想法如何-使用Try{}
Catch{}
?
Try {
Invoke-WebRequest -uri 'https://64.73.217.183/javascript/javascript_alert_box_example_2.cfm'
} Catch {
"$_"
}
由于“ $ _”仅产生简单
基础连接已关闭:发送中发生意外错误。
如果您不希望出现任何错误,请删除或标记"$_"
。
如果您想了解有关Powershell错误处理的完整资源,请阅读The Big Book of PowerShell Error Handling
重新编辑显然,关闭alert
框并不是那么容易。根据我的调查,它似乎是Powershell中的iexplorer实例。
根据我的研究,我认为无法“抑制”显示的警报窗口。
但是,您可以采用这种方式(一种解决方法):
一个脚本是原始脚本:
$x = Invoke-WebRequest -uri 'http://activelab.io/code-snippets/show-alert-box-on-page-load'
$x.Forms
第二个是关闭窗口(您需要具有WASP(用于Powershell的Windows自动化管理单元)模块):
Import-Module WASP
start-Sleep -Seconds 15
$web_alert = Get-Process | Where-Object { $_.MainWindowTitle -
Like 'Message from webpage' } # this is what identifies the window (based on your example)
select-window $web_alert | Set-windowActive | send-keys '{Enter}' # press enter
然后按照这些原则编写第三个脚本,它们应该在后台异步启动脚本(这只是一个快速的快照,您可以像PoshRSJob这样看似:
$jobA = Start-Process PowerShell -Argument 'C:\script1.ps1'
$jobB = Start-Process PowerShell -Argument 'C:\script2.ps1'