PowerShell 实现批量下载文件
简介
批量文件下载器 PowerShell 版,类似于迅雷批量下载功能,且可以破解 Referer 防盗链
源代码
[int]$script:completed = 0 # 下载完成数量
[int]$script:succeed = 0 # 下载成功数量 # 开始下载(普通方法)
function StartDownload {
param([array]$urlList, [string]$path, [string]$referer)
$last = $urlList.Count
$watch = Measure-Command {
for($i = 0; $i -lt $last; $i++) {
DownloadItem -url $urlList[$i] -path $path -referer $referer
Start-Sleep -Milliseconds 200 # 延迟0.2秒
}
}
$failed = $script:completed - $succeed
$elapsed = [Math]::Round($watch.TotalMilliseconds/1000, 2) # 总计耗时(秒)
Write-Output ""
Write-Host "总共下载 $script:completed,成功 $script:succeed,失败 $failed,耗时 $elapsed s" -ForegroundColor Red -BackgroundColor Yellow
$script:completed = 0
$script:succeed = 0
} # 下载单个文件
function DownloadItem {
param([string]$url, [string]$path, [string]$referer)
$url_file = $url.Substring($url.LastIndexOf('/') + 1);
if($referer.Contains("(*)")) {
$referer = $referer -replace "\(\*\)", $url
}
try {
$tmpFileName = [System.IO.Path]::GetTempFileName()
$destFileName = [System.IO.Path]::Combine($path, $url_file)
$watch = Measure-Command {
# 下载文件到临时文件夹
Invoke-WebRequest -Uri $url -Method Get -Headers @{"Referer"=$referer} -UserAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36" -TimeoutSec 120 -OutFile $tmpFileName
# 将临时文件移动到目标文件夹
Move-Item -Path $tmpFileName -Destination $destFileName -Force
}
$script:succeed += 1
$fileLength =[Math]::Ceiling((Get-Item -LiteralPath $destFileName).Length / 1024.0)
$elapsed = [Math]::Round($watch.TotalMilliseconds)
# 下载成功!12.jpg - 115KB/2356ms
Write-Host "下载成功!$url_file - $fileLength KB/$elapsed ms" -ForegroundColor Green
} catch {
Write-Error $PSItem.ToString()
} finally {
$script:completed += 1
}
} # 主函数 运行 AppStart 即可启动
function AppStart {
Clear-Host
Write-Welcome
$urlFormat = ReadInput_Url -message "输入URL(含通配符,例如 http://www.spany.com/2019/(*).jpg)"
$start = ReadInput_Integer -message "通配符数字开始(0~200)" -minValue 0 -maxValue 200
$end = $start + 200
$end = ReadInput_Integer -message "通配符数字结束($start~$end)" -minValue: $start -maxValue $end
$len = ReadInput_Integer -message "通配符数字长度(1~5)" -minValue: 1 -maxValue 5
$referer = ReadInput_Url -message "输入Referer为破解防盗链(如果Referer中含有通配符(*),则将被当前URL替换,如无须Referer则直接回车)" -defaultValue "https://www.baidu.com/visit"
Write-Output "" $urlList = BuildUrlList -urlFormat $urlFormat -start $start -end $end -len $len
if($urlList.Count -gt 0) {
Write-Output "URL列表如下:"
foreach($url in $urlList) {
Write-Output "`t$url"
}
Write-Output ""
if(ReadInput_YesOrNo -message "是否开始下载?(y/n)") {
$path = ReadInput_Path -message "输入文件存储目录"
Write-Output ""
StartDownload -urlList $urlList -path $path -referer $referer
}
} else {
Write-Warning "不能创建URL列表,请核对参数!"
}
Write-Output ""
} AppStart
完整代码: https://gitee.com/codefelix/spany-down-ps.git
如何使用
定位到文件目录,右键 spany-down-ps.ps1 选择“使用 PowerShell 运行”,如提示此系统上禁止运行脚本,可执行命令 Set-ExecutionPolicy -ExecutionPolicy Unrestricted 更改执行策略
也可以在 Windows PowerShell 工具,定位到脚本所在目录,通过 .\spany-down-ps.ps1 执行脚本
然后按照屏幕提示,输入必要参数,启动下载进程,截图演示下载某网站的美女写真集
如果你直接打开图片或者用迅雷批量下载,都将被 403 Forbidden,因为网站启用了 Referer 防盗链

不过 PowerShell 版还是单线程顺序下载,另一个 C#/.NET Core 版 https://gitee.com/codefelix/spany-down-sharp 采用异步下载,有进度显示,效率更高
PowerShell 实现批量下载文件的更多相关文章
- C#异步批量下载文件
C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...
- Java批量下载文件并zip打包
客户需求:列表勾选需要的信息,点击批量下载文件的功能.这里分享下我们系统的解决方案:先生成要下载的文件,然后将其进行压缩,生成zip压缩文件,然后使用浏览器的下载功能即可完成批量下载的需求.以下是zi ...
- 批量下载文件web
最近需要这个所以写了一个例子一般批量下载由以下步骤组成: 1.确定下载的源文件位置 2.对文件进行打包成临时文件,这里会用到递归调用,需要的嵌套的文件夹进行处理,并返回文件保存位置 3.将打包好的文件 ...
- java批量下载文件为zip包
批量下载文件为zip包的工具类 package com.meeno.trainsys.util; import javax.servlet.http.HttpServletRequest; impor ...
- php批量下载文件
最近用codeigniter开发一个图片网站,发现单文件下载很容易实现,批量下载的话,就有点麻烦. 普通php下载比较简单,比如我封装的一个函数: function shao_download($fi ...
- python_crawler,批量下载文件
这个第一个python3网络爬虫,参考书籍是<python网络数据采集>.该爬虫的主要功能是爬取某个网站,并将.rar,.doc,.docx,.zip文件批量下载. 后期将要改进的是,用后 ...
- ASP.NET批量下载文件的方法
一.实现步骤 在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹.然后调用 RAR程序,对临时文件夹进行压缩,然后输出到 ...
- ASP.NET批量下载文件
一.实现步骤 在用户操作界面,由用户选择需要下载的文件,系统根据所选文件,在服务器上创建用于存储所选文件的临时文件夹,将所选文件拷贝至临时文件夹.然后调用 RAR程序,对临时文件夹进行压缩,然后输出到 ...
- 【197】PowerShell 通过 FTP 下载文件
参考:使用 WGET 从FTP上下载文件 在 PowerShell 使用 wget2 工具,代码如下: wget2 ftp://user:password@192.168.14.31/1.jpg 其中 ...
随机推荐
- mysql的orde by 按照指定状态顺序排序
要求按照以下顺序排序 审核中->审核拒绝->待放款->放款失败->待还款->已结清->已逾期 { id:80, label:'审核中'},{ id:100, lab ...
- ASP.NET MVC4添加区域视图 找到多个与名为“home”的控制器匹配的类型
今天在项目中遇到一个问题,在MVC下想建立一个区域的后台Boss视图,出现了"找到多个与名为“home”的控制器匹配的类型"的问题,希望下面的解决方案能够帮助到大家 这是网站的整体 ...
- CKeditor5 图片上传
下面是自定义了一个适配器,之前我一直是在 ClassicEditor .create( editorElement, { ckfinder: { uploadUrl: '/ckfinder/core/ ...
- [少数派]如何学习Git
用玩游戏的方式学习 Git 目录 为什么要学习 Git 怎么学习 Git Learn Git Branching 其他学习资源 用游戏的方式来学习,是一种有趣而高效的方式. 从刚接触电脑时的打字练习软 ...
- 20175316 盛茂淞 MyCP(课下作业,必做)
题目要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支持两个参数: java MyCP -tx XXX1.txt XXX2.bin 用来把文本文件(内容为 ...
- ES部署报错 max file size 和 kibana 报错File size limit exceeded
启动失败一 ERROR: [2] bootstrap checks failed [1]: max file descriptors [4096] for elasticsearch process ...
- jquery学习总结24-36
一.jquery的自定义事件 1.自定义事件不能通过eventName()来添加,只能通过on来绑定 2.自定义事件需要通过trigger(自动触发)来进行触发 二.jauery事件命名空间 1.事件 ...
- 利用canvas实现刮刮乐效果
最近做了个情人节表白的项目,表白内容时被遮盖的,刮开后才能显示,并且刮开一定比例后清空所有遮罩. function guaguale(obj,w,h){//obj时canvas元素 var canva ...
- 使用Python脚本分析你的网站上的SEO元素
撰稿马尼克斯德芒克 上2019年1月, Sooda internetbureau Python就是自动执行重复性任务,为您的其他搜索引擎优化(SEO)工作留出更多时间.没有多少SEO使用Python来 ...
- C# MVC验证Model
.NET Core MVC3 数据模型验证的使用 这里我先粘贴一个已经加了数据验证的实体类PeopleModel,然后一一介绍. using System; using System.Collecti ...