Answers:
这是一个简单的PS 3.0和更高版本的单行代码,其工作原理并不涉及太多的PS barf:
wget http://blog.stackexchange.com/ -OutFile out.html
注意:
wget
是的别名 Invoke-WebRequest
在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,则需要安装Windows Management Framework的版本4或更高版本。
您可能会发现,使用$ProgressPreference = "silentlyContinue"
before Invoke-WebRequest
可以大大提高大文件的下载速度。此变量控制是否呈现进度UI。
如果只需要检索文件,则可以使用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
到目前为止我所看到的最好的对应关系。谢谢!
$client.DownloadFile( "http://blog.stackexchange.com/", "c:/temp2/_Download.html")
(new-object System.Net.WebClient).DownloadData($url) | Out-Null
有Invoke-WebRequest
在即将到来的PowerShell版本3:
Invoke-WebRequest http://www.google.com/ -OutFile c:\google.html
dd
……
-Outfile
当您可以仅使用>
(覆盖)或>>
(附加)到文件时,该参数似乎无关紧要。
wget
做:)
wget
和curl
被aliasted到Invoke-WebRequest
(iwr
默认):d
有点混乱,但是此博客文章为您提供了下载文件的说明。
另外(我建议您这样做),您可以使用BITS:
Import-Module BitsTransfer
Start-BitsTransfer -source "http://urlToDownload"
它将显示进度,并将文件下载到当前目录。
Start-BitsTransfer : Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED))
。我很困惑:|
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
无法在此处工作)。
这是一个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
以下函数将获取一个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中提供的名称将文件下载到当前目录。设置Windows功能后,请使用包含wget的Windows 10 bash shell。
如何在Windows上安装Ubuntu bash shell:
如果您的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
(该站点不允许我将其添加为评论,因为我显然为此需要更多的“声誉”-因此它得到了一个新的答案)
带有-outfile参数的Invoke-WebRequest需要一个字符串,因此,如果您的文件名以数字开头且未用引号引起来,则不会创建任何输出文件。
例如。 Invoke-WebRequest -Uri "http://www.google.com/" -outfile "2.pdf"
这不会影响以字母开头的文件名。
wget
是的别名Invoke-WebRequest
,并且与上面的类似)