- Invork-WebRequest
- WebClient对象
- BitsTransfer模块
layout: post
title: Powershell下载文件的三种方法
date: 2021-09-29
tags: [“BitsTransfer”,“download”,“powershell”,“powershell”,“计算机技术”]
使用powershell不借助第三方软件下载文件(据我所知)有三种方法:Invork-WebRequest, System.Net.WebClient, Start-BitsTransfer.
Invork-WebRequestInvork-WebRequest -Uri "" -OutFile " " #吐槽一下这个Uri参数,不应该是Url吗? #该参数有几个别名,wget、iwr、curl,但在pwsh7.0后wget和curl被取消了,可能开发者也觉得这样凑热度不太好。 iwr -Uri " " -OutFile " "
这个命令本来是用于发起web请求的,用OutFile参数将响应保存下来就能实现文件的下载。
不过这个命令下载文件时先将数据存在内存里,全部下载完成后才会写入磁盘,因此下载大文件时容易炸内存。
值得一提的是该命令返回的对象是经过解析的Microsoft.PowerShell.Commands.WebResponseObject对象,可以直接读出页面中的内容,所以可以用来写一个简单的爬虫。
PS> $bingImageSearch = Invoke-WebRequest -Uri "https://cn.bing.com/images/search?q=cats&first=1&tsc=ImageBasicHover"
PS> $bingImageSearch.Images | select class,alt,src
class alt src
----- --- ---
id_avatar sw_spd 个人资料图片 data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNgY...
rms_img /rp/kFAqShRrnkQMbH6NYLBYoJ3lq9s.png
fltIco rms_img 筛选器 data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTZweCIgaGVpZ2h0PSIxNHB4IiBmb2N1c2FibGU9I...
fltFillIco rms_img 筛选器 data:image/svg+xml;base64,PHN2ZyBmb2N1c2FibGU9ImZhbHNlIiB4bWxucz0iaHR0cDovL3d3dy53M...
mimg rms_img cats 的图像结果 https://tse1-mm.cn.bing.net/th/id/OIP-C.C0bliNuG3LA1bDPoRTeAnwHaFj?w=191&h=143&c=7&...
mimg rms_img cats 的图像结果 https://tse3-mm.cn.bing.net/th/id/OIP-C.23-NBtgiB3zQCjz3qlD9YgHaLG?w=191&h=286&c=7&...
mimg rms_img cats 的图像结果 https://tse3-mm.cn.bing.net/th/id/OIP-C.Ftos_Tg660JqK0WpjPH-HQHaJ4?w=191&h=255&c=7&...
##此处省略多行
PS> $bingImageSearch.links | select id,class,href
id class href
-- ----- ----
b_logoArea /?FORM=Z9FD1
sw_clx javascript:void(0);
javascript:void(0);
##此处省略多行
PS> $bingImageSearch.InputFields | Format-Table
outerHTML
---------
" id="sb_form_go" tabIndex="0" name="go" value="搜索" />
##此处省略多行
WebClient对象
#实例化WebClient对象
PS> $client = [System.Net.WebClient]::new()
#调用DownLoadFile方法。
PS> $client.DownloadFile("","")
#该方法的重载:
PS> $client.DownloadFile
OverloadDefinitions
-------------------
void DownloadFile(string address, string fileName)
void DownloadFile(uri address, string fileName)
这种方法据说是速度最快的,虽然我没有实际实验过,但想想也是,毕竟直接调用库里的类就不需要解析响应也不需要在异步任务中排队,肯定速度快。很适合多线程的下载任务。
不过这个方法也有缺点,下载过程没有进度条,不知道已经下载了多少。
BitsTransfer模块这是我个人最为推荐的方法。
Start-BitsTransfer -Source "" -Destination " "
这个模块也是Windows Update用来下载更新的模块,能够实现异步下载(排队的那种,不是多线程),并且管理方便。
可以上BitsTransfer Module ’ Microsoft Docs阅读完整的文档,这里只举几个例子。
#下载多个文件 PS> $list = @" >> source,destination >> s1,d1 >> s2,d2 >> s3,d3 >> "@ PS> $list = $list | ConvertFrom-Csv PS> $list | Start-BitsTransfer #异步下载 PS> Start-BitsTransfer -Source "" -Destination " " -Asynchronous PS> Get-BitsTransfer
也可以用来上传文件。
Start-BitsTransfer -Source "" -Destination " " -TransferType Upload
或者设置优先级,使其不会与正在进行的任务抢带宽。
Start-BitsTransfer -Source "" -Destination " " -Priority Low
本文同步发表于我的个人博客NucomBlog
转载请注明出处,谢谢。



