我知道我可以下载并安装上述库(适用于Windows的wget),但是我的问题是:

在Windows PowerShell中,是否有wget的本机替代品?

我只需要wget,即可使用HTTP GET从给定的URL检索文件。例如:

wget http://www.google.com/


评论

另请参见superuser.com/questions/25538/…

#1 楼

这是一个简单的PS 3.0及更高版本的单行代码,其工作原理并不涉及很多PS barf:

wget http://blog.stackexchange.com/ -OutFile out.html


请注意:



wgetInvoke-WebRequest的别名

Invoke-WebRequest返回HtmlWebResponseObject,该对象包含许多有用的HTML解析属性,例如链接,图像,表单,输入字段等。但是在这种情况下,我们只是使用原始Content
,文件内容在写入磁盘之前就已存储在内存中,这使这种方法不适合下载大文件。

在Windows Server Core安装中,您需要将其写为

wget http://blog.stackexchange.com/ -UseBasicParsing -OutFile out.html



在2014年9月20日之前,我建议

(wget http://blog.stackexchange.com/).Content >out.html


作为答案。但是,这并非在所有情况下都可行,因为>运算符(是Out-File的别名)会将输入转换为Unicode。


如果使用Windows 7,则将您需要安装版本4或更高版本的Windows Management Framework。

您可能会发现,在$ProgressPreference = "silentlyContinue"之前执行Invoke-WebRequest可以显着提高大文件的下载速度;此变量控制是否呈现进度UI。

评论


现在这是正确的答案,我遇到wget意外地测试了是否安装了实际的wget。令人烦恼的是它无法轻松获取文件名(您必须在输出重定向中指定它),但是此选项具有比真实wget更好的UI(我认为),因此就可以了。

–马修·沙利(Matthew Scharley)
2014年1月14日,0:52



但是Windows 7仅随PowerShell 2.0一起提供,结果将是“术语'Invoke-WebRequest'未被识别为cmdlet的名称,...”。

– Peter Mortensen
2014年6月6日在17:51



合理警告:此方法会将文件的全部内容放入内存中,然后再将其写出到文件中。这不是下载大文件的好方法。

–im_nullable
14年7月13日在6:35

@im_nullable,打个招呼-我已将其添加到帖子中。

–沃伦·鲁马克(Warren Rumak)
2014-09-18 15:47

@dezza我用另一种方法更新了答案。再试一次。

–沃伦·鲁马克(Warren Rumak)
2014年9月20日20:06

#2 楼

如果只需要检索文件,则可以使用WebClient对象的DownloadFile方法:

$client = New-Object System.Net.WebClient
$client.DownloadFile($url, $path)


其中$url是代表文件URL的字符串,而$path是表示文件将保存到的本地路径。

请注意,$path必须包含文件名;它不能只是目录。

评论


到目前为止,这是提出的最佳解决方案。同样,考虑到我似乎可以以一种行格式将其重写为(new-object System.Net.WebClient).DownloadFile('$ url,$ path),这是到目前为止我所见过的wget的最佳对应。谢谢!

– jsalonen
2011-11-28 10:49

作为旁注,您还可以使用类似(new-object System.Net.WebClient).DownloadFileAsync(url,filePath)之类的方法异步执行此操作

–詹姆斯
13年4月23日在8:49



是的,这可以在Windows 7(PowerShell 2.0附带)上直接使用。示例:$ client.DownloadFile(“ http://blog.stackexchange.com/”,“ c:/temp2/_Download.html”)

– Peter Mortensen
2014年6月6日17:57



对于仅获取URL并忽略结果(例如,IIS预热脚本的一部分),请使用DownloadData:(new-object System.Net.WebClient).DownloadData($ url)|空空

– BurnsBA
17年5月2日在18:35

错误消息是无济于事的。如果$ path是目录或现有文件,则将引发通用异常。啊,微软。

–BaseZen
18 Mar 30 '18 at 14:24

#3 楼

即将发布的PowerShell版本3中有Invoke-WebRequest

Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html


评论


dd的所有优雅...

– gWaldo
2012年8月31日15:29

@gWaldo,您在开玩笑–使用起来很有趣(就像刚学习PS的人一样)

–user84636
2012年10月16日在20:41

我只是说,当您可以对文件使用>(覆盖)或>>(附加)时,-Outfile参数似乎无关紧要。

– gWaldo
2012年10月17日在13:12



@gWaldo甚至像wget一样从URL推断出文件名:)

–珀尔帖
13年7月17日在10:29

从PS 4.0开始,wget和curl在默认情况下被别名为Invoke-WebRequest(iwr):D

–鲍勃
2014年3月25日16:12

#4 楼

有点混乱,但是有一篇博客文章为您提供了下载文件的说明。

(或者,我建议您使用BITS):

Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"


它将显示进度并将文件下载到当前目录。

评论


BITS依靠服务器端的支持(如果可用)在后台运行,并且您可以使用其他cmdlet获得进度更新。

–理查德
2011-11-28 10:42

我尝试获取google.com,但得到的只是Start-BitsTransfer:访问被拒绝。 (来自HRESULT的异常:0x80070005(E_ACCESSDENIED))。我很困惑:|

– jsalonen
2011-11-28 10:45

@jsalonen我认为BITS只会下载文件而不是页面。正如理查德所说,它依赖于某些服务器端支持(尽管我认为这不是特定于Microsoft的)。

–马修·斯蒂夫斯(Matthew Steeples)
11年11月28日在11:09

我看到了,我想我知道使用BITS的意义,但是,这不是我在这里想要的。

– jsalonen
11年11月28日在11:23

#5 楼

PowerShell V4一线式:

(iwr http://blog.stackexchange.com/).Content >index.html`




(iwr http://demo.mediacore.tv/files/31266.mp4).Content >video.mp4



这基本上是沃伦( V3单线版(非常感谢!)-进行了微小的更改,以使其能够在V4 PowerShell中使用。

沃伦的单线版-仅使用wget而不是iwr-应该仍然适用于V3(至少,我想;不过没有测试过)。无论如何。但是,当尝试在V4 PowerShell中执行它时(如我所尝试的那样),您会看到PowerShell无法将wget解析为有效的cmdlet /程序。从Bob的评论中回答接受的答案(谢谢,伙计!)-因为从PowerShell V4开始,wgetcurl被别名为Invoke-WebRequest,默认情况下设置为iwr。因此,wget无法解析(以及curl在此处无法运行)。

#6 楼

这是一个PowerShell函数,可以在下载文件之前解析短URL。

function Get-FileFromUri {  
    param(  
        [parameter(Mandatory=$true, Position=0, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true)]
        [string]
        [Alias('Uri')]
        $Url,
        [parameter(Mandatory=$false, Position=1)]
        [string]
        [Alias('Folder')]
        $FolderPath
    )
    process {
        try {
            # resolve short URLs
            $req = [System.Net.HttpWebRequest]::Create($Url)
            $req.Method = "HEAD"
            $response = $req.GetResponse()
            $fUri = $response.ResponseUri
            $filename = [System.IO.Path]::GetFileName($fUri.LocalPath);
            $response.Close()
            # download file
            $destination = (Get-Item -Path ".\" -Verbose).FullName
            if ($FolderPath) { $destination = $FolderPath }
            if ($destination.EndsWith('\')) {
                $destination += $filename
            } else {
                $destination += '\' + $filename
            }
            $webclient = New-Object System.Net.webclient
            $webclient.downloadfile($fUri.AbsoluteUri, $destination)
            write-host -ForegroundColor DarkGreen "downloaded '$($fUri.AbsoluteUri)' to '$($destination)'"
        } catch {
            write-host -ForegroundColor DarkRed $_.Exception.Message
        }  
    }  
}  


像这样使用它可以将文件下载到当前文件夹:

Get-FileFromUri http://example.com/url/of/example/file  


或将文件下载到指定的文件夹:

Get-FileFromUri http://example.com/url/of/example/file  C:\example-folder  


#7 楼

以下函数将获取URL。

function Get-URLContent ($url, $path) {
  if (!$path) {
      $path = Join-Path $pwd.Path ([URI]$url).Segments[-1]
  }
  $wc = New-Object Net.WebClient
  $wc.UseDefaultCredentials = $true
  $wc.Proxy.Credentials = $wc.Credentials
  $wc.DownloadFile($url, $path)
}


一些注释:


仅当您是在身份验证代理后面。为了简单使用,(New-Object Net.WebClient).DownloadFile($url, $path)可以正常工作。
该路径必须是绝对路径,因为下载不在当前目录中完成,因此相对路径将导致下载在某处丢失。
if (!$path) {...}部分处理了一种简单的情况,您只想使用URL中给定的名称将文件下载到当前目录。


#8 楼

如果您的Windows足够新(例如1809版或更高版本),则可以使用“真正的”卷曲。 curl具有命令行选项“ -O”(大写字母O;小写字母也不会这样做!)选项“ -O”或“ --remote-name”告诉curl,保存的文件将与URL的文件名部分的名称相同。

需要以“ curl.exe”开头,以将其与“ Invoke-WebRequest”的别名“ curl”区分开来。顺便说一句,它可以在cmd.exe中正常运行。

使用与此处另一个答案相同的示例

curl.exe -O http://demo.mediacore.tv/files/31266.mp4


(该站点不会请允许我将其添加为评论,因为我显然为此需要更多的“声誉”-因此它获得了新的答案)

#9 楼

设置Windows功能后,请使用包含wget的Windows 10 bash shell。

如何在Windows上安装Ubuntu bash shell:

YouTube:在Windows上的Ubuntu上运行Bash!

用于Linux文档的Windows子系统

评论


考虑在此答案中添加一些引用的引用,以支持您所说的情况(以防链接消失),因此答案内容仍然可用,当前只能根据您的建议通过该链接使用。

–以前的Pimp Juice IT
17年9月27日在3:36

#10 楼

带有-outfile参数的Invoke-WebRequest需要一个字符串,因此,如果您的文件名以数字开头且未用引号引起来,则不会创建任何输出文件。

Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"

这不会影响以字母开头的文件名。

评论


其他答案中提到了该解决方案(wget是Invoke-WebRequest的别名,与上面的类似)

–bertieb
18年11月27日在18:27



答案的重点是强调注释。由于语法错误,所有答案均未涉及未创建任何文件的问题。

–金巴
18年11月28日在10:28

那真的应该是对其他答案的评论

–bertieb
18-11-28在13:02

此答案未在其他答案中提供,也未与上述答案类似。

–金巴
19 Mar 23 '19在15:19

#11 楼

这应该可以解决没有浏览器初始化的内容。请注意“ -UseBasicParsing”参数。

Invoke-WebRequest http://localhost -UseBasicParsing


评论


(1)什么是“没有浏览器初始化的东西”? (2)请注意,接受的答案已经提到-UseBasicParsing。

–斯科特
19年4月28日在6:07