在Windows PowerShell中,是否有
wget
的本机替代品?我只需要
wget
,即可使用HTTP GET从给定的URL检索文件。例如:wget http://www.google.com/
#1 楼
这是一个简单的PS 3.0及更高版本的单行代码,其工作原理并不涉及很多PS barf:wget http://blog.stackexchange.com/ -OutFile out.html
请注意:
wget
是Invoke-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开始,wget
和curl
被别名为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
评论
另请参见superuser.com/questions/25538/…