找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
楼主: 小白龙

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

[复制链接]
 楼主| 发表于 2024-9-19 21:26:26 | 显示全部楼层
回复 11# flashercs


    大佬, 我查了一些资料, 下面是官方链接和示例, 是不是上面的代码中要添加 --parallel-max 10?

curl 从版本 7.66.0 开始支持 --parallel 和 --parallel-max 选项,允许并行下载多个文件。
https://daniel.haxx.se/blog/2019 ... p-3-future-is-here/

并行下载示例:
curl --parallel --parallel-max 10 -O http://example.com/file1 -O http://example.com/file2
发表于 2024-9-19 22:09:44 | 显示全部楼层
回复 15# 小白龙

单纯cs 没有powershell
.net有system.tasks.parellel并行操作
有net类下载 哪个不比命令行管道输入输出稳定可靠 安全有效
思维不能按着bat里面向for编程那一套来
 楼主| 发表于 2024-9-22 21:25:15 | 显示全部楼层
回复 11# flashercs


    大佬, 想请教一下, 这个代码怎样加出错的判断呢? 用 if (-not $?) 不灵
发表于 2024-9-23 12:05:01 | 显示全部楼层
回复 18# 小白龙
  1. if($LASTEXITCODE -ne 0)
复制代码
发表于 2024-9-23 23:07:46 | 显示全部楼层
粒度要求不高的话,直接用 System.Net.WebClient 的 DownloadFileAsync 实例方法就能异步下载
而且 WebClient 的 DownloadProgressChanged 事件中可以获取下载大小和百分比等信息
只是控制台的输出不像窗口那样自由,加上powershell那些坑爹的设定,单个的进度条还好,多个的就麻烦了
总之可以试试参考下面的

  1. #没有线程同步,可能会出现奇怪的问题
  2. #没有线程同步,可能会出现奇怪的问题
  3. $uris=@(
  4. "https://dldir1v6.qq.com/weixin/Windows/WeChatSetup.exe" #微信
  5. "https://dldir1.qq.com/qqfile/qq/QQNT/Windows/QQ_9.9.15_240902_x64_01.exe" #QQ
  6. "https://dldir1.qq.com/qqfile/qq/TIM3.5.0/TIM3.5.0.22143.exe" #TIM
  7. )

  8. $path = "$home\Desktop\weixin.exe"  # 确保这是一个完整的文件路径
  9. $dir = "$home\Desktop"
  10. $wc=[collections.arraylist]::new($uris.length)
  11. $str=[collections.arraylist]::new($uris.length)
  12. $done=[collections.arraylist]::new($uris.length)
  13. $uris |foreach {
  14. $wc.add([System.Net.WebClient]::new());
  15. $str.add('0#0#0#');
  16. $done.add($false)
  17. }|out-null

  18. $charpro={
  19. $i=0;$j=0;$uris |foreach {
  20. [console]::write($uris[$j].split('/')[-1]);
  21. $s=$str[$j].split('#')
  22. [console]::writeline('    {0}/{1}',[int64]([int64]$s[0]*[int64]$s[1]/100),$s[0])
  23. $l=[int](($cw-8)*[int]$s[1]/100)
  24. [console]::writeline('[{0}{1}] {2}%','='*$l,' '*($cw-8-$l),$s[1])
  25. $i+=2;$j+=1
  26. }|out-null
  27. }

  28. $evt1={
  29. '$index='+$args[0]+';'+'
  30. #$evArgs=$event.SourceEventArgs;
  31. #write-host ($EventArgs.TotalBytesToReceive+"#"+$EventArgs.ProgressPercentage+"#"+$EventArgs.BytesReceived+"#")
  32. $str[$index]=""+$EventArgs.TotalBytesToReceive+"#"+$EventArgs.ProgressPercentage+"#"+$EventArgs.BytesReceived+"#";
  33. $null;'
  34. }

  35. $evt2={"`$index=$args;"+'$done[$index]=$true'}

  36. $i=0;$wc |foreach {
  37. register-objectevent -InputObject $_ -EventName 'DownloadProgressChanged' -SourceIdentifier ('DlProCh'+$i) -Action ([scriptblock]::create($evt1.invoke($i,$uris.length)))
  38. register-objectevent -InputObject $_ -EventName 'DownloadFileCompleted' -SourceIdentifier ('DlComp'+$i) -Action ([scriptblock]::create($evt2.invoke($i)))
  39. $i+=1
  40. }|out-null

  41. $i=0;$wc |foreach {$_.DownloadFileAsync($uris[$i],$dir+'\'+$uris[$i].split('/')[-1]);$i+=1}

  42. [console]::CursorVisible=$false
  43. '';'';while($true){
  44. $cl=[console]::CursorLeft
  45. $ct=[console]::CursorTop
  46. $cw=[console]::WindowWidth
  47. $charpro.invoke()
  48. [console]::SetCursorPosition($cl,$ct)
  49. if(($done|where{$_}).length -eq $uris.length){
  50. $charpro.invoke()
  51. break
  52. }
  53. }
  54. [console]::CursorVisible=$true
  55. cmd /c pause
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:08 , Processed in 0.016621 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表