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 其中 ...
随机推荐
- How to change system keyboard keymap layout on CentOS 7 Linux
The easiest way to swap between keymaps and thus temporarily set keys to different language by use o ...
- 输入ip和端口号python脚本py文件
1.利用.py文件进行打开URL,编辑以下文件代码保存文件为login.py: # _*_ coding: cp936 _*__all_ = ['ip','port','root_id']ip='10 ...
- 第一次面试经历(hr面)
经过介绍,我有幸去到一家国际背景的广告公司面试前端开发实习生.收到的邮件是复试通知,看来我已经跳过了第一轮面试. 来到hr请我进了一个小间坐下里填求职书,里面有各种个人信息,有兴趣爱好,有工作经历,以 ...
- js最实用string(字符串)类型的使用及截取与拼接详解
var a = '世界上最远的距离不是天涯海角'; 一.通过字符获取位置或通过位置获取字符: //指定位置返回字符console.log(str.charAt(1));console.log(str[ ...
- rest接口webservice接口利用http请求方式发送数据
所需依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>h ...
- 纯css实现无限嵌套菜单
效果图: demo:关键的地方都以颜色明显标识 <!DOCTYPE html> <html> <head> <title>menu</title& ...
- 异常:No Spring WebApplicationInitializer types detected on classpath
原因: 启动服务提供者/服务消费者-->去注册中心Zookeeper无法注册这个服务 / 在监控中心无法发现服务 异常提示:No Spring WebApplicationInitializer ...
- typeof 和 instanceof apply与call简单用法以及判断数组的坑
1 typeof 和 instanceof var array = [];平时如果判断一个对象是否为数组,可能你会用 typeof array,但是输出为“object”. typeof 一般只能返回 ...
- MUI动态生成轮播图片
$$.ajax({ url:'http://localhost:8080/api/v1/food/listFeatureFood', type:'Get', xhrFields: {withCrede ...
- 中标麒麟(linux)下Qt调用python数据转换
转自:https://blog.csdn.net/itas109/article/details/78733478 mytest.py文件 # -*- coding: utf-8 -*- def he ...