PowerShell一键下载Nuget某个包的所有版本
一转眼好几年没有写博客了,来博客园冒个泡,最近由于工作需要,内网办公,幸运的是只需要上传一个*.nupkg一个包信息就可以在私有nuget下载到了,下面就用PowerShell编写下载脚本,需要注意的是PowerShell后缀ps1(最后一个数字1),以Newtonsoft.Json为例:
下载地址
# 设置NuGet包列表的URL
$packageName = "Newtonsoft.Json"
$targetHttp = "https://www.nuget.org/packages/"
$targetUrl = "{0}{1}" -f $targetHttp, $packageName
保存地址
# 设置保存已下载包的目录
$outputDirectory = "D:\nuget_packages"
if (-not (Test-Path $outputDirectory)) {
New-Item -Path $outputDirectory -ItemType Directory
}
解析下载版本地址
定义下载需要解析的包地址
# 定义下载前缀
$httpPrefix = "https://www.nuget.org/api/v2/package/"
# 下载html文件内容
$htmlContent = Invoke-WebRequest -Uri $targetUrl -UseBasicParsing | Select-Object -ExpandProperty Content
# 匹配标签
$pattern = "<.*?>"
$matches = [regex]::Matches($htmlContent, $pattern)
获取所有a标签
foreach ($match in $matches) {
$tag = $match.Value
# 获取a标签
if ($tag -like "<a href=*") {
Write-Host $tag
}
}
输出结果
<a href="#" id="skipToContent" class="showOnFocus" title="Skip To Content">
...
<a href="/packages/System.Xml.XmlDocument/">
<a href="/packages/Newtonsoft.Json/13.0.3" title="13.0.3">
...
<a href="/packages/Newtonsoft.Json/3.5.8" title="3.5.8">
<a href="/stats/packages/Newtonsoft.Json?groupby=Version" title="Package Statistics">
...
<a href="/packages/Newtonsoft.Json/13.0.3/ReportAbuse" title="Report the package as abusive">
<a href="/packages/Newtonsoft.Json/13.0.3/ContactOwners" title="Ask the package owners a question">
...
观察上一步结果可以看出来每一个版本都有title,且title内容是版本
# 获取含有title的a标签
if ($tag -like "*title=*") {
Write-Host $tag
}
输出结果
<a href="#" id="skipToContent" class="showOnFocus" title="Skip To Content">
<a href="/packages/Newtonsoft.Json/13.0.3" title="13.0.3">
...
<a href="/packages/Newtonsoft.Json/3.5.8" title="3.5.8">
<a href="/stats/packages/Newtonsoft.Json?groupby=Version" title="Package Statistics">
<a href="https://www.newtonsoft.com/json" data-track="outbound-project-url" title="Visit the project site to learn more about this package" rel="nofollow">
...
<a href="/packages/Newtonsoft.Json/13.0.3/ReportAbuse" title="Report the package as abusive">
<a href="/packages/Newtonsoft.Json/13.0.3/ContactOwners" title="Ask the package owners a question">
<a href="/packages?q=Tags%3A%22json%22" title="Search for json" class="tag">
接着上一步的结果继续过滤
# 截取href的内容
$substr = $tag.Substring(9)
if ($substr -like "/packages/*") {
Write-Host $substr
}
输出结果
/packages/Newtonsoft.Json/13.0.3" title="13.0.3">
...
/packages/Newtonsoft.Json/3.5.8" title="3.5.8">
/packages/Newtonsoft.Json/13.0.3/ReportAbuse" title="Report the package as abusive">
/packages/Newtonsoft.Json/13.0.3/ContactOwners" title="Ask the package owners a question">
有完没完,又来了?看上面的结果就还差过滤两个不相关的了,

获取href完整内容
# 查找第一个双引号的位置
$index = $substr.IndexOf('"')
# 获取部分/packages/Newtonsoft.Json/13.0.3
$substr = $substr.Substring(0,$index)
剔除最后两个版本无关的a标签
# 排除报告滥用a标签
if ($substr -notlike "*/ReportAbuse") {
# 排除联系作者a标签
if ($substr -notlike "*/ContactOwners") {
# 匹配版本
$endIndex = $substr.LastIndexOf('/')
$startPackageIndex = $endIndex + 1
$packageVersion = $substr.Substring($startPackageIndex)
}
}
Invoke-WebRequest命令下载并保存文件
# 下载地址nupkg
$packageUrl = "{0}{1}/{2}" -f $httpPrefix,$packageName,$packageVersion
# 生成保存文件的路径
$packageFile = Join-Path -Path $outputDirectory -ChildPath "$packageName.$packageVersion.nupkg"
# 下载 .nupkg 文件
Write-Host "Downloading $packageName version $packageVersion from $packageUrl"
Invoke-WebRequest -Uri $packageUrl -OutFile $packageFile
全部代码

# 设置NuGet包列表的URL
$packageName = "Newtonsoft.Json"
$targetHttp = "https://www.nuget.org/packages/"
$targetUrl = "{0}{1}" -f $targetHttp, $packageName
# 设置保存已下载包的目录
$outputDirectory = "D:\nuget_packages"
if (-not (Test-Path $outputDirectory)) {
New-Item -Path $outputDirectory -ItemType Directory
}
# 定义下载前缀
$httpPrefix = "https://www.nuget.org/api/v2/package/"
# 下载html文件内容
$htmlContent = Invoke-WebRequest -Uri $targetUrl -UseBasicParsing | Select-Object -ExpandProperty Content
# 匹配标签
$pattern = "<.*?>"
$matches = [regex]::Matches($htmlContent, $pattern)
foreach ($match in $matches) {
$tag = $match.Value
# 获取a标签
if ($tag -like "<a href=*") {
# 获取含有title的a标签
if ($tag -like "*title=*")
{
# 截取href的内容
$substr = $tag.Substring(9)
if ($substr -like "/packages/*")
{
# 查找第一个双引号的位置
$index = $substr.IndexOf('"')
# 获取部分/packages/Newtonsoft.Json/13.0.3
$substr = $substr.Substring(0,$index)
# 排除报告滥用a标签
if ($substr -notlike "*/ReportAbuse")
{
# 排除联系作者a标签
if ($substr -notlike "*/ContactOwners")
{
# 匹配版本
$endIndex = $substr.LastIndexOf('/')
$startPackageIndex = $endIndex + 1
$packageVersion = $substr.Substring($startPackageIndex)
# 下载地址nupkg
$packageUrl = "{0}{1}/{2}" -f $httpPrefix,$packageName,$packageVersion
# 生成保存文件的路径
$packageFile = Join-Path -Path $outputDirectory -ChildPath "$packageName.$packageVersion.nupkg"
# 下载 .nupkg 文件
Write-Host "Downloading $packageName version $packageVersion from $packageUrl"
Invoke-WebRequest -Uri $packageUrl -OutFile $packageFile } } } } }
}
# 执行结束暂停
$null = Read-Host
PowerShell一键下载Nuget某个包的所有版本的更多相关文章
- AMD and CMD are dead之KMDjs集成Blob一键下载全部build包
更新 不zuo,[A/C]MD就不会死,所以kmdjs赢来来其伟大的版本0.0.6,该版本主要的更新有: 移除去了kmdjs.get(..).then的支持,只支持kmdjs.get(-,functi ...
- VS项目中使用Nuget还原包后编译生产还一直报错?
Nuget官网下载Nuget项目包的命令地址:https://www.nuget.org/packages 今天就遇到一个比较奇葩的问题,折腾了很久终于搞定了: 问题是这样的:我的解决方案原本是好好的 ...
- zh-Hans vs.net 通过 管理nuget程序包下载简体中文语言包 zh-cn
zh-Hans vs.net 通过 管理nuget程序包下载简体中文语言包 在搜索中输入:zh-hans
- vs2013中使用nuget下载cefsharp winform包
cefsharp是chrome的一个开源项目,基于webkit的一个浏览器.下载cefsharp需要安装nuget.之后管理nuget程序包,联机搜索cef即可找到winform包.
- 离线下载解决Nuget程序包及其依赖包的方法
由于使用的一台电脑没有联网,但是需要asp.net core项目时使用到一个package,于是在nuget.org上手动下载.但是最后发现,依赖的包实在太多,手动下载太费时.于是晚上花时间研究了一下 ...
- 自己编辑Nuget拓展包,并发布Nuget服务器,提供下载使用
1. 在NuGet官网上注册并获取API Key 到NuGet上注册一个新的账号,然后在My Account页面,获取一个API Key,如果没有则在API keys 页面创建一个就可以. 2. 下载 ...
- 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包
将项目复制到其地方的时候编译会报错,按照官网方法也不行,从网上查了一个有用的方法如下 打开CSPROJ文件.删除如下代码, <Import Project="..\packages\ ...
- 解决C#项目出现“此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props”
1.打开项目的.csproj文件 2.删掉如下选中的内容: 3.右键项目-->管理NuGet程序包(N) 找到Microsoft.CodeDom.Providers.DotNetCompiler ...
- 用命令行工具创建 NuGet 程序包
NuGet.exe 下载地址 本文翻译自: https://docs.nuget.org/Create/Creating-and-Publishing-a-Package https://docs.n ...
- 这台计算机上缺少此项目引用的 NuGet 程序包-缺少的文件是 ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props
异常处理汇总-开发工具 http://www.cnblogs.com/dunitian/p/4522988.html 协助开发里面总有几个是极简爱好者,但是呢删了不该删的就会影响项目开发,下面看下完 ...
随机推荐
- RabbitMQ——死信队列介绍和应用
死信和死信队列的概念 什么是死信?简单来说就是无法被消费和处理的消息.一般生产者将消息投递到broker或者queue,消费者直接从中取出消息进行消费.但有时因为某些原因导致消息不能被消费,导致消息积 ...
- 优化 Go 语言数据打包:性能基准测试与分析
优化 Go 语言数据打包:性能基准测试与分析 场景:在局域网内,需要将多个机器网卡上抓到的数据包同步到一个机器上. 原有方案:tcpdump -w 写入文件,然后定时调用 rsync 进行同步. 改造 ...
- [Tkey] Transport Nekomusume II
CL-20 考虑定义一条有向边 \(u\rightarrow v\) 的意义为 \(u\) 把窝让给了 \(v\),那么每个点一定入度为 \(1\),所有的边会形成一个外向基环树森林. 贪心地把猫娘按 ...
- 从0到1搭建权限管理系统系列四 .net8 中Autofac的使用(附源码)
说明 该文章是属于OverallAuth2.0系列文章,每周更新一篇该系列文章(从0到1完成系统开发). 该系统文章,我会尽量说的非常详细,做到不管新手.老手都能看懂. 说明:OverallAuth2 ...
- 14. 迭代器、生成器、模块与包、json模块
1.迭代器 1.1 迭代器介绍 迭代器是用来迭代取值的工具 每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代 # while循环实现迭代取值 a = [1, 2, 3, 4, 5, ...
- 使用BPF之前和之后生成直方图过程的对比
以bitehist为例: 使用BPF之前: 1.在内核中:开启磁盘IO事件的插桩观测. 2.在内核中,针对每个事件:向perf缓冲区写入一条记录.如果使用了跟踪点技术(推荐方式),记录中会包含关于磁盘 ...
- eBPF 概述:第 2 部分:机器和字节码
1. 前言 我们在第 1 篇文章中介绍了 eBPF 虚拟机,包括其有意的设计限制以及如何从用户空间进程中进行交互.如果你还没有读过这篇文章,建议你在继续之前读一下,因为没有适当的介绍,直接开始接触机器 ...
- 谈谈 keep-alive 组件,以及它们的实现原理
keep-alive 组件的使用场景: 我们切换 2 个组件的时候,2个组件会轮流被销毁创建,但是现在需求,切换到一个组件,另一个组件不会别销毁,会保留原来的状态 :就要使用 vue 内置的组件 ke ...
- python中模块的概念以及常用模块
模块的概念:为了减少常用代码重复输入,同时方便多人协作,python中定义了模块一词. 模块是一些函数的集合.在python中可以使用import导入某一模块的单个或者所有功能. python中的模块 ...
- Centos7 安装配置FTP服务
1.FTP简介 ftp(File Transfer Protocol文件传输协议)是基于TCP/IP 协议的应用层协议,用于文件的传输,包括ftp服务器(或服务端)和ftp客户端 FTP协议会在客户端 ...