忘记密码   免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
查看: 729 | 回复: 2

[学习共享] 分享两个powershell的,命令行进度条。 [复制链接]

论坛徽章:
0
发表于 2017-08-28 13:11 |显示全部楼层
本帖最后由 本友会机友会摄友会 于 2017-08-29 16:54 编辑

powershell 可以在for,foreach中嵌入【进度条命令】,用于处理大量重复数据时表明进度,用之极爽!
此进度条最短为空,最长为当前命令窗口宽度。在标题栏下方,不占用光标位置,不插入标准输出,颜色醒目。
下面的脚本是例子,支持win,linux。

  1. $分母 = 888
  2. for ($i=1;$i -lt 888 ;$i++)
  3. {
  4.     [int]$百分比 = $i / $分母 * 100
  5.     Write-Progress  -Activity  "进度条标题---【for 进度条的例子:】"     -PercentComplete $百分比
  6.     Start-Sleep  -Milliseconds 10    #这里是你的脚本任务
  7.     #write-host  $分子,$分母,$百分比,'%'
  8. }

  9. #----------------------------------------------------------------------------------------------
  10. $1000个元素 = 1..1000
  11. $分子 = 0
  12. $分母 = $1000个元素.length - 1
  13. foreach ($temp001 in $1000个元素)
  14. {
  15.     [int]$百分比 = $分子 / $分母 * 100
  16.     Write-Progress  -Activity  "进度条标题---【foreach 进度条的例子:】"     -PercentComplete $百分比
  17.     Start-Sleep  -Milliseconds 10    #这里是你的脚本任务
  18.     #write-host  $分子,$分母,$百分比,'%'
  19.     $分子++
  20. }
复制代码

以上两个进度条命令在元素特别多,每个元素只是简单,快速处理的时候不适用。
因为提取,计算百分比太频繁。搞得for,foreach,基本上都是在做进度分析显示了。
还有另一种情况,不方便用for,那么,我们就需要一个更好的进度条。
我设计的进度条如下:

使用powershell多线程,建立一个定时器,每隔20----30秒,计算并输出秒输出一次,进度百分比到标题栏,
用一个开关,当 $开始统计进度.Enabled = $true 时,统计进度开始运行,$开始统计进度.Enabled = $false时,停止后台统计进程。
脚本如下:
  1. $开始统计进度 = New-Object System.timers.Timer
  2. $开始统计进度.Interval = 1000 * 10 #10秒
  3. $开始统计进度.Autoreset = $true
  4. $进度统计代码 =
  5. {
  6.     write-host  '.'   -NoNewline
  7.     $百分比 = ($global:i / $global:分母 ).tostring("P")
  8.     [console]::Title = "当前完成进度: $百分比"
  9. }
  10. Register-ObjectEvent -InputObject $开始统计进度 -EventName Elapsed -SourceIdentifier '这里起个名字'  -Action $进度统计代码 | Out-Null
  11. $开始统计进度.Enabled = $false


  12. write-host  '---开始---'
  13. $开始统计进度.Enabled = $true
  14. $global:分母 = 8888
  15. for ($global:i=1;$global:i -lt $global:分母;$global:i++)
  16. {
  17.     Start-Sleep  -Milliseconds 10    #这里是你的脚本任务
  18. }
  19. $开始统计进度.Enabled = $false

  20. #清理
  21. Unregister-Event '这里起个名字'
  22. $开始统计进度.Dispose()
  23. $global:i  = $null
  24. $global:分母 = $null
  25. [console]::Title = ""
  26. write-host  "`n---完成---"
复制代码


结论:
任何进度统计,都要有两个步骤的代码:
1 分子++
2 分子/分母。

后台定时器的作用,是把这两个步骤分离了。
分子++还是嵌入在你的业务循环代码中。而后台定时器,定时回调第二部分代码,计算百分比,并输出。

多线程+后台+定时器对象。这是powershell多线程的好处之一。python是支持定时器对象的。




论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
发表于 2017-08-29 01:56 |显示全部楼层
回复 1# 本友会机友会摄友会

you screenshot ma?

论坛徽章:
0
发表于 2017-08-29 14:39 |显示全部楼层
代码在win7,win10中的效果,和在linux中的是一样的。自己在win中测试下吧,论坛贴图困难。

linux:
win+putty+linux发行版+powershell。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号 北京市公安局海淀分局网监中心备案编号:11010802020122
广播电视节目制作经营许可证(京) 字第1234号 中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP