【问题标题】:Automating Saving a file from the web with the IE COM object in Powershell使用 Powershell 中的 IE COM 对象自动从 Web 保存文件
【发布时间】:2015-04-08 17:18:52
【问题描述】:

我在 Powershell 中使用 IE11 的 COM 对象对网站进行身份验证并下拉订单列表。到目前为止,我的脚本已成功发送用户名和密码以及进入订单页面,我什至可以“单击”下载所需文件的链接。问题是,不是像我需要的那样保存文件,而是打开/保存对话框出现并且脚本炸弹。

我尝试让 IE11 自动通过editing the registry and specifying the Excel.CSV type 保存文件,但这不起作用。下载链接实际上是一个按钮,它调用一个复杂的 Javascript 函数,并且在我需要的 CSV 文件的最终结果中,但我试图破译发出 POST 请求的 JS,并在 IE COM 对象上使用 Navigate() 方法无济于事。

我意识到这不是自动化 Web 流程的最佳方式,但我不知道如何解决页面上的所有 Javascript 以使用像 Invoke-WebRequest 这样的 cmdlet。当一切都是 Javascript 时,仅使用 HTTP GET 和 POST 有点困难!

非常感谢任何帮助。这是一个代码示例。

Function Get-PageElement ($Name,$TagName,$Id) {
    if ($Name) {
        $InternetExplorer.Document.getElementsByName($Name)
    } elseif ($TagName) {
        $InternetExplorer.Document.getElementsByTagName($TagName)
    } elseif ($Id) {
        $InternetExplorer.Document.getElementById($Id)   
    }
}


$script:InternetExplorer = New-Object -com "InternetExplorer.Application"
$script:InternetExplorer.visible = $true
$InternetExplorer.Navigate($Url)


$DownloadButton = Get-PageElement -Id btnExport
$DownloadButton.Click()

【问题讨论】:

  • 你能发布一个你正在使用的代码示例吗?

标签: internet-explorer powershell com


【解决方案1】:
#Start IE and navigate to your download file/location
$ie = New-Object -Com internetExplorer.Application
$ie.Navigate("http://www.your.website.here.com/awesome_stuff/DOC_1.docx")

#------------------------------
#Wait for Download Dialog box to pop up
Sleep 5
while($ie.Busy){Sleep 1} 
#------------------------------

#Hit "S" on the keyboard to hit the "Save" button on the download box
$obj = new-object -com WScript.Shell
$obj.AppActivate('Internet Explorer')
$obj.SendKeys('s')

#Hit "Enter" to save the file
$obj.SendKeys('{Enter}')

#Closes IE Downloads window
$obj.SendKeys('{TAB}')
$obj.SendKeys('{TAB}')
$obj.SendKeys('{TAB}')
$obj.SendKeys('{Enter}')

【讨论】:

    【解决方案2】:

    如果您无法解析 javascript 并获取所需的 url,您可以使用 wscript 发送击键。请注意,这可能是一个糟糕的主意,如果有任何方法可以解析 javascript 并获取原始 url 以使用 WebClient 下载,我不会推荐它。

    $wsh = new-object -comobject wscript.shell
    $id = (Get-Process iexplore* | Where-Object{$_.MainWindowTitle -match "YOUR.WEB.PAGE.TITLE.HERE"}).id
    if($wsh.AppActivate($id)){
        start-sleep -milliseconds 500
        $wsh.SendKeys("{S}")
        #I don't have IE11 stuck on 8 due to corporate policy you may need a second sendkeys here
        #if so insert a 500 millisecond delay
    }
    

    【讨论】:

    • 谢谢,但我不能这样做,因为这将在没有打开窗口的情况下在计划任务中执行。 :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2010-10-26
    • 2015-08-31
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 2016-08-07
    相关资源
    最近更新 更多