PowerShell实现时间管理小秘书

2019-09-30 11:13:22刘景俊

记录

至此“观察”这一步算是解决了。可是怎么“记录”呢?这个也挺简单,用个数组就搞定,每次查看如果发现Internet Explorer就把上网+1,发现Microsoft Word就把文档+1就好了呀。好在PowerShell早就想到了这一切,就算不动用.NET中强大的数据结构,它也内置了Hash-Table这一数据类型,非常适合我们完成统计任务。

比如我们想监测上网,写代码和写文档的时间,只要编写这样的脚本就好:

$timeInterval = 30  #每30s监测一次
$record = @{"上网" = 0; "编程" = 0; "文档" = 0}
$count = 0
while ($true)
{
    $titles = ps | ? {$_.MainWindowTitle} | select MainWindowTitle
    $titles | % { #这部分用来匹配窗口标题并进行统计,可以自由定义
        if ($_ -match "Internet Explorer") {$record["上网"]++}
        if ($_ -match "Visual Studio") {$record["编程"]++}
        if ($_ -match "Microsoft Word") {$record["文档"]++}
        if ($_ -match "Microsoft Office OneNote") {$record["文档"]++}
        if ($_ -match "Microsoft PowerPoint") {$record["文档"]++}
    }
    sleep($timeInterval) #将线程转入睡眠,每30秒唤醒一次
    $count = ($count + 1) % 10 #为了防止数据丢失,每10次记录写入文件一次
    if ($count -eq 0) {$record > d:temptimeRecord.txt}
}

代码非常简单,大意就是把每个窗口的标题进行匹配并统计。执行起来也很快,在毫秒量级。由于每30秒才执行一次,所以对系统几乎没有影响。

如果要求不高的话,只要在开着电脑的时候后台运行这个脚本就好了。每天下班的时候去看看记录文档,时间如何花费自然一目了然。但是这样毕竟要占用PowerShell的会话窗口,同时无法实时得知当前的统计结果。因此下面将试图演示如何让这个脚本在后台执行,同时使我们能及时看到当前的时间利用率。如果你对这方面内容不感兴趣的话可以直接跳到下一节,这部分不会影响后面的阅读。:-)

PowerShell提供了强大的后台任务管理,使用起来也一样简单。我们可以把这个脚本存成一个脚本文件,比如Motinor.ps1,然后在PowerShell中键入start-job {c:usersgrapeotMonitor.ps1}就可以在后台运行它了。我们可以看到PowerShell返回以下文字之后就又回到了命令行,于是可以继续处理其他事务:


Id              Name            State      HasMoreData     Location