[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 请求大佬完善并行下载器PowerShell代码

我在github找到一个C#的并行下载器组件, 使用下面的代码可以成功下载weixin,
但是我想同时,并行下载: 微信 + QQ + TIM, 并且有三个软件下载的进度条显示, 就像开源页中演示的那样的效果, 不用像它那样复杂, 有几个文件需要下载, 就显示几个进度条就行了
请求大佬支招, 多谢

开源地址:
https://github.com/bezzad/Downloader

多线下载进度条演示, 用右键从新标签页打开图片:



先下载.net 4.62的dll: https://www.nuget.org/api/v2/package/Downloader/3.1.2
  1. Add-Type -Path $PSScriptRoot\Downloader.dll
  2. # 创建 DownloadBuilder 实例
  3. $downloadBuilder = [Downloader.DownloadBuilder]::New()
  4. $url_WX = "https://dldir1v6.qq.com/weixin/Windows/WeChatSetup.exe" #微信
  5. $url_QQ = "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe" #QQ
  6. $url_TIM = "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe" #TIM
  7. $path = "$home\Desktop\weixin.exe"  # 确保这是一个完整的文件路径
  8. $dir = "$home\Desktop"
  9. # 创建 DownloadConfiguration 实例并设置属性
  10. $downloadConfig = [Downloader.DownloadConfiguration]@{
  11.     ChunkCount = 1
  12.     ParallelDownload = $true
  13. }
  14. # 配置下载
  15. $downloadBuilder = $downloadBuilder.WithUrl($url_WX)
  16. $downloadBuilder = $downloadBuilder.WithDirectory($dir)
  17. $downloadBuilder = $downloadBuilder.WithConfiguration($downloadConfig)
  18. $downloadBuilder = $downloadBuilder.WithFileLocation($path)
  19. # 构建下载对象
  20. $download = $downloadBuilder.Build()
  21. # 异步开始下载
  22. $awaiter = $download.StartAsync().GetAwaiter()
  23. $awaiter.GetResult()
复制代码

powershell对多线程有限制,用curl.exe --parallel更快
  1. Add-Type -Path .\Downloader.dll
  2. $url_WX = "https://dldir1v6.qq.com/weixin/Windows/WeChatSetup.exe" #微信
  3. $url_QQ = "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe" #QQ
  4. $url_TIM = "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe" #TIM
  5. # 创建 DownloadConfiguration 实例并设置属性
  6. $downloadConfig = [Downloader.DownloadConfiguration]@{
  7.     ChunkCount       = 4
  8.     ParallelDownload = $true
  9. }
  10. #  创建DownloadService
  11. $downloadService = [Downloader.DownloadService]::new($downloadConfig)
  12. # Register object event listener
  13. Register-ObjectEvent -InputObject $downloadService -EventName DownloadProgressChanged -SourceIdentifier downloadService.DownloadProgressChanged -Action {
  14.     #$EventArgs.ProgressPercentage|Out-Host
  15.     $percent = [Math]::Truncate($EventArgs.ProgressPercentage * 100) -as [int]
  16.     Write-Progress -Activity "downloading:$($EventArgs.ProgressId)" -Status ("{0:F0}% Completed:" -f $percent) -Id 2 -PercentComplete $percent -CurrentOperation $EventArgs.ProgressId
  17. }
  18. Register-ObjectEvent -InputObject $downloadService -EventName ChunkDownloadProgressChanged  -SourceIdentifier downloadService.ChunkDownloadProgressChanged  -Action {
  19.     #$EventArgs.ProgressPercentage|Out-Host
  20.     $percent = [Math]::Truncate($EventArgs.ProgressPercentage * 100) -as [int]
  21.     Write-Progress -Activity "downloading:$($EventArgs.ProgressId)" -Status ("{0:F0}% Completed:" -f $percent) -ParentId 2 -PercentComplete $percent -CurrentOperation $EventArgs.ProgressId
  22. }
  23. # 下载tim.exe
  24. $task1 = $downloadService.DownloadFileTaskAsync($url_TIM, ".\download\tim.exe")
  25. $awaiter = $task1.GetAwaiter()
  26. while (-not $awaiter.IsCompleted) { Start-Sleep -Milliseconds 200; }
  27. Unregister-Event -SourceIdentifier *
复制代码
微信:flashercs
QQ:49908356

TOP

往下载对象里订阅添加
DownloadStarted
ChunkDownloadProgressChanged
DownloadProgressChanged
DownloadFileCompleted
这四个事件(参考示例源码,在事件里写进度条代码)

我脑子不好,不会弄进度条这些特效代码,反正那源码用的是ShellProgressBar,你可以试试http://www.nuget.org/packages/ShellProgressBar/

TOP

回复 2# flashercs

多谢大佬, powershell不是支持并行处理吗?
我用gpt生成了如下代码, 能执行成功, 但是没有进度条, 发现gpt还是不够智能, N多轮才能搞成
  1. # 定义文件的URL和保存路径
  2. $urls = @(
  3.     "https://dldir1v6.qq.com/weixin/Windows/WeChatSetup.exe",
  4.     "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe",
  5.     "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe"
  6. )
  7. # 获取桌面路径
  8. $desktop = [System.Environment]::GetFolderPath('Desktop')
  9. # 创建一个存储作业的数组
  10. $jobs = @()
  11. # 启动并行下载作业
  12. foreach ($url in $urls) {
  13.     $fileName = Split-Path $url -Leaf
  14.     $outputPath = Join-Path $desktop $fileName
  15.     $jobs += Start-Job -ScriptBlock {
  16.         param($downloadUrl, $savePath)
  17.         Invoke-WebRequest -Uri $downloadUrl -OutFile $savePath
  18.     } -ArgumentList $url, $outputPath
  19. }
  20. # 等待所有作业完成
  21. $jobs | ForEach-Object {
  22.     Wait-Job $_
  23.     Remove-Job $_
  24. }
  25. Write-Host "所有文件下载完成!"
复制代码

TOP

回复 2# flashercs
用 curl.exe --parallel  在gpt中死活就是搞不成功, ai还是太弱智了, 哎
  1. # 定义文件的URL和保存路径
  2. $urls = @(
  3.     "https://dldir1v6.qq.com/weixin/Windows/WeChatSetup.exe",
  4.     "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe",
  5.     "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe"
  6. )
  7. # 获取桌面路径
  8. $desktop = [System.Environment]::GetFolderPath('Desktop')
  9. # 使用 curl.exe 并行下载,重定向输出到 $null 以避免 PowerShell 处理输出内容
  10. & curl.exe --parallel `
  11.     --output "$desktop\WeChatSetup.exe" $urls[0] `
  12.     --output "$desktop\QQ_9.9.15.exe" $urls[1] `
  13.     --output "$desktop\TIM3.5.0.exe" $urls[2] `
  14.     *> $null
复制代码

TOP

回复 3# Five66


    我脑子更不好使, 完全看不懂, 大佬如果懂原理, 用gpt估计能搞出来, 我不行, gpt不听我使唤

TOP

回复 2# flashercs


    我的想法是, 进度条是字符的那种, 就像用python命令行安装某些库的那种进度, 在powershell控制台中显示的, 不是图形化的那种进度条

TOP

回复 7# 小白龙

powershell进度条不是控制台字符,而是图形化的.
微信:flashercs
QQ:49908356

TOP

回复 8# flashercs


    大佬, 刚刚用了下面的方法, 发现很多时候weixin.exe下载后的文件为0字节, 其它两个文件下载就没事, 看来curl下载不稳定啊, 另外gpt说 curl.exe --parallel没有这个参数
  1. # 定义文件的URL和保存路径
  2. $urls = @(
  3.     "https://dldir1v6.qq.com/weixin/Windows/WeChatSetup.exe",
  4.     "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe",
  5.     "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe"
  6. )
  7. # 获取桌面路径
  8. $desktop = [System.Environment]::GetFolderPath('Desktop')
  9. # 创建一个存储进程的数组
  10. $processes = @()
  11. # 启动并行下载进程
  12. foreach ($url in $urls) {
  13.     $fileName = Split-Path $url -Leaf
  14.     $outputPath = Join-Path $desktop $fileName
  15.     $process = Start-Process -FilePath "curl.exe" `
  16.         -ArgumentList "--output `"$outputPath`" `"$url`"" `
  17.         -PassThru #-NoNewWindow
  18.     $processes += $process
  19. }
  20. # 等待所有进程完成
  21. $processes | ForEach-Object {
  22.     $_.WaitForExit()
  23. }
  24. Write-Host "所有文件下载完成!"
复制代码

TOP

回复 8# flashercs


    用curl.exe同时下载, 真是有点奇怪, 经常下载weixin.exe是0字节, 为什么呢

TOP

回复 10# 小白龙
  1. # curl.exe路径,7.76+才支持--parallel
  2. $curl = "curl.exe"
  3. # 定义文件的URL和保存路径
  4. $downloads = @(
  5.   @{
  6.     src  = "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe"
  7.     dest = "$home\downloads\tim.exe"
  8.   }
  9.   @{
  10.     src  = "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe"
  11.     dest = "$home\downloads\qq.exe"
  12.   }
  13. )
  14. $begin = $true
  15. $downloads | ForEach-Object {
  16.   if ($begin) {
  17.     $begin = $false
  18.   } else {
  19.     '--next'
  20.   }
  21.   '--url "{0}"' -f $_.src
  22.   '--output "{0}"' -f ($_.dest.Replace('\', '\\'))
  23.   '--location'
  24.   '--compressed'
  25.   '--tr-encoding'
  26.   '--globoff'
  27. } -End {
  28.   '--parallel'
  29. } | & $curl --config -
复制代码
微信:flashercs
QQ:49908356

TOP

回复 11# flashercs


    我的curl版本是7.79也报错, 但是能下载
-----------------------------------------------------版本:
C:\Users\Administrator>curl -V
curl 7.79.1 (Windows) libcurl/7.79.1 Schannel
Release-Date: 2021-09-22
Protocols: dict file ftp ftps http https imap imaps pop3 pop3s smtp smtps telnet tftp
Features: AsynchDNS HSTS IPv6 Kerberos Largefile NTLM SPNEGO SSL SSPI UnixSockets
-------------------------------------------------------报错:
curl.exe : Warning: <stdin>:4: warning: '--compressed' the installed libcurl version
所在位置 行:31 字符: 5
+ } | & $curl --config -
+     ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (Warning: <stdin...ibcurl version :String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

Warning: doesn't support this
Warning: <stdin>:11: warning: '--compressed' the installed libcurl version
Warning: doesn't support this
DL% UL%  Dled  Uled  Xfers  Live   Qd Total     Current  Left    Speed
--  --      0     0     2     2     0 --:--:-- --:--:-- --:--:--     0      
  7 --  21.4M     0     2     2     0  0:00:06 --:--:--  0:00:05 42.6M      
15 --  42.9M     0     2     2     0  0:00:06  0:00:01  0:00:05 42.7M      
23 --  64.3M     0     2     2     0  0:00:06  0:00:01  0:00:04 42.7M      
31 --  85.8M     0     2     2     0  0:00:06  0:00:02  0:00:04 42.7M      
39 --   107M     0     2     2     0  0:00:06  0:00:02  0:00:03 42.7M      
47 --   128M     0     2     2     0  0:00:06  0:00:03  0:00:03 42.7M      
55 --   150M     0     2     2     0  0:00:06  0:00:03  0:00:02 42.8M      
62 --   171M     0     2     1     0  0:00:06  0:00:04  0:00:02 42.8M      
70 --   192M     0     2     1     0  0:00:06  0:00:04  0:00:01 42.8M      
78 --   214M     0     2     1     0  0:00:06  0:00:05  0:00:01 42.8M      
86 --   235M     0     2     1     0  0:00:06  0:00:05 --:--:-- 42.8M      
94 --   257M     0     2     1     0  0:00:06  0:00:06 --:--:-- 42.8M      
100 --   272M     0     2     0     0  0:00:06  0:00:06 --:--:-- 42.8M     

PS C:\Windows\System32\WindowsPowerShell\v1.0>

TOP

回复 11# flashercs


  感觉用curl代码的--parallel不太通用, 不如用start启动多个下载通用, 但就是不稳定, 很多时候体积大的文件无法下载, 只下载一个0k的文件

TOP

所以不用powershell拉倒 直接写c#不是更好吗
你好

TOP

回复 14# jyswjjgdwtdtj


   怎样写? powershell中可以嵌入C#吧?

TOP

返回列表