下载网址内容

时间:2009-12-29 10:14:13

标签: powershell

我正在使用脚本,我可以浏览网页内容或“网址”,但我无法复制其中的网页内容。下载为文件。 这是我到目前为止所做的:

$url = "http://sp-fin/sites/arindam-sites/_layouts/xlviewer.aspx?listguid={05DA1D91-F934-4419-8AEF-B297DB81A31D}&itemid=4&DefaultItemOpen=1"
$ie=new-object -com internetexplorer.application
$ie.visible=$true
$ie.navigate($url)
while($ie.busy) {start-sleep 1} 

如何复制$url的内容并将其作为文件保存到本地驱动器?

更新

我收到了这些错误:

  

使用“2”参数调用“DownloadFile”的异常:“远程服务器返回错误:(401)未经授权。”在:line:6 char:47 +(New-Object system.net.webclient).DownloadFile(<<<<“$ url / download-url-content”,'save.html')

     

在方法调用中缺少')'。在:行:6 char:68 +(New-Object system.net.webclient).DownloadFile(“$ url”,'save.html'<<<<<

     

使用“2”参数调用“DownloadFile”的异常:“远程服务器返回错误:(401)未经授权。”在:line:6 char:47 +(New-Object system.net.webclient).DownloadFile(<<<<<“$ url”,'save.html')

好的,让我解释一下,我想要做的事情:我在我们的共享点网站上有一个excel文件&这是我尝试在本地下载的文件(任何格式),这是脚本的一部分,因此对于脚本的后半部分,我可以将此文件与其他数据进行比较。得到一个输出。

现在,如果我可以以某种方式从网站上映射“我的文档”&能够下载该文件,这对我也有用。

7 个答案:

答案 0 :(得分:27)

据我了解,您尝试使用IE,因为如果自动发送您的凭据(或者您可能不知道任何其他选项)。

为什么上述答案无效是因为您尝试从SharePoint下载文件并发送未经身份验证的请求。回复是401。

这有效:

PS>$wc=new-object system.net.webclient
PS>$wc.UseDefaultCredentials = $true
PS>$wc.downloadfile("your_url","your_file")

如果Posh的当前用户有权下载文件(与IE中记录的文件相同)。

如果没有,试试这个:

PS>$wc=new-object system.net.webclient
PS>$wc.Credentials = Get-Credential
PS>$wc.downloadfile("your_url","your_file")

答案 1 :(得分:21)

2014年1月更新:使用Windows 8发布的Powershell v3,您可以执行以下操作:

 (Invoke-webrequest -URI "http://www.kernel.org").Content

原帖,对Powershell第2版有效

此解决方案与stej,Jay Bazusi和Marco Shaw的其他答案非常相似。 通过在模块目录psurl中安装新模块,可以更加通用。模块psurl添加了新的命令,以防你需要使用powershell进行大量的html-fetching(和POSTing)。

(new-object Net.WebClient).DownloadString("http://psget.net/GetPsGet.ps1") | iex

请参阅代码共享网站http://psget.net/的主页。

  

这个不错的PowerShell脚本行将下载GetPsGet.ps1并发送   它将Invoke-Expression安装PsGet模块。

然后安装 PsUrl ,一个受 curl 启发的Powershell模块:

要从中央目录安装某些东西(在我们的例子中是PsUrl),只需输入:

install-module PsUrl

get-module -name psurl

输出:

ModuleType Name                      ExportedCommands
---------- ----                      ----------------
Script     psurl                     {Get-Url, Send-WebContent, Write-Url, Get-WebContent}

命令:

get-command -module psurl

输出:

CommandType     Name                                                Definition
-----------     ----                                                ----------
Function        Get-Url                                             ...
Function        Get-WebContent                                      ...
Alias           gwc                                                 Get-WebContent
Function        Send-WebContent                                     ...
Alias           swc                                                 Send-WebContent
Function        Write-Url                                           ...

你只需要这样做一次。

请注意,可能会发生此错误:

问:错误“无法加载文件xxx,因为在此系统上禁用了脚本执行。有关详细信息,请参阅”get-help about_signing“。

答:默认情况下,PowerShell会限制所有脚本的执行。这完全是关于安全性的。要“修复”此操作,请以管理员身份运行PowerShell 并调用

Set-ExecutionPolicy RemoteSigned

从现在开始,在您的新PowerShell会话/脚本中,执行以下操作:

import-module psurl
get-url "http://www.google.com"

要下载并保存到文件,请执行以下操作:

get-url "http://www.google.com" | out-file -filepath "myfile.html"

答案 2 :(得分:12)

如果您只想下载网页内容,请使用

(New-Object System.Net.WebClient).DownloadFile( 'download url content', 'save.html' )

答案 3 :(得分:11)

我不知道使用该界面保存的任何方法。

这是否正确呈现页面:

PS>$wc=new-object system.net.webclient
PS>$wc.downloadfile("your_url","your_file")

答案 4 :(得分:3)

正如https://stackoverflow.com/a/35202299/4636579中已经回答,但有强制代理和凭据。没有代理,它将是:

$url="http://aaa.bbb.ccc.ddd/rss.xml"

$WebClient = New-Object net.webclient

$path="C:\Users\hugo\xml\test.xml"

$WebClient.DownloadFile($url, $path)

答案 5 :(得分:2)

$web = New-Object Net.WebClient

$web | Get-Member

$content=$web.DownloadString("http://www.bing.com")

答案 6 :(得分:0)

如果您真的只关心原始的 string 内容,那么其他人提到的最佳方法是使用.NET中的构造来完成此操作。但是,我认为在前面的答案中,有一些机会被错过了。

  • 通常最好在WebRequest上使用use WebClient,因为它可以更好地控制整个请求周期
  • 通过System.IO.StreamReader通过WebRequest进行响应缓冲
  • 创建可测试,可重用的工具。这就是PowerShell的本质和目的
function Get-UrlContent {
    <#
    .SYNOPSIS
        High performance url fetch

    .DESCRIPTION
        Given a url, will return raw content as string.

        Uses: 
        System.Net.HttpRequest
        System.IO.Stream
        System.IO.StreamReader

    .PARAMETER Url
        Defines the url to download

    .OUTPUTS
        System.String

    .EXAMPLE
        PS C:\> Get-UrlContent "https://www.google.com"
        "<!doctype html>..."
    #>

    [cmdletbinding()]
    [OutputType([String])]
    param(
        [Parameter(Mandatory, ValueFromPipeline)]
        [ValidateNotNullOrEmpty()]
        [string] $Url)

    Write-Debug "`n----- [Get-UrlContent]`n$url`n------`n`n"

    $req = [System.Net.WebRequest]::CreateHttp($url)

    try {
        $resp = $req.GetResponse()    
    }
    catch {
        Write-Debug "`n------ [Get-UrlContent]`nDownload failed: $url`n------`n"
    }
    finally {
        if ($resp) {
            $st = $resp.GetResponseStream()
            $rd = [System.IO.StreamReader]$st

            $rd.ReadToEnd()     
        }

        if ($rd) { $rd.Close() }
        if ($st) { $st.Close() }
        if ($resp) { $resp.Close() }   
    }
}