PowerShell实现时间管理小秘书_PowerShell

引言

是不是觉得同样是活着,别人为啥就能做这么多事呢?

是不是经常8小时班上下来,却不晓得自己干了些啥?

是不是习惯于在Email, BBS, Google Reader间切换,感觉也挺忙的呢?

你需要时间管理!

你知道自己一天写了多少代码吗?

你了解自己一周有多少时间在网上游荡吗?

你能说出一个月有几天陪着家人吗?

你需要PowerShell!

管理?先记录!

时间管理就是用最少的时间做最多的事。和优化程序的性能一样,为了提升时间的利用率,得先知道自己的时间都花在什么地方。如果上班时间有50%都浪费在琐事上,剩下的一半时间再集中精力,一天的成效也好不到哪去。相应的,如果90%的时间都在干活,相比于竭力缩小剩下的走神时间,反不如稍稍提高一点效率。射箭强调有的放矢,治病讲求对症下药。知晓瓶颈所在是优化的前提。

那么如何知道自己的弱点在什么地方?记录,养成记录的习惯。

试想当一周结束,你看到一张统计表:这周加班5小时,所有工作时间中,27%写代码,22%开会,16%写文档,35%偷菜。写了3600行代码,出现了75个bug,自查出69个。是不是觉得时间管理一下子简单了很多?多写代码少偷菜,少生孩子多养猪呗。当然这个“偷菜”可以是很多东西,办公室政治,信息上瘾,搭公交上下班...如果没有这个表,恐怕很多时候自己都意识不到有这样多的时间浪费在了琐事上,还在苦恼怎么提高效率呢。

记录不仅可以为管理服务,这个行动本身就能给人带来动力。“吾日三省吾身,则知明而行无过矣。”记录不仅仅是动动笔,当回顾过去所为的时候,它更是一个“省”的过程。为什么前两周每周都是3000+行代码这周只有1500-?为什么昨天老婆发了3次火而此前3周一共才生两次气?为什么...?声色犬马,光影浮华,我们太容易忽略一些就发生在我们身边的变化,而随手的记录,说不定就会让我们即时警醒。

可是...难道要我每次上网都要记下来上了几分钟,每次老婆发火都要立马翻个小本子出来记个陈年烂芝麻帐吗?

记录太烦人,秘书来帮忙

当然不,你需要的只是一个秘书。这个人心隔肚皮的世界小蜜可要不起,不过电脑,手机这些冷冰冰的塑料家伙倒真可以成为你的伙伴。我没有能力搜罗出一系列神通广大的软件来一下告诉你上个月偷了几棵菜上了多少网,但也许可以启发你打造自己的电脑秘书。

让电脑这个不怕麻烦的家伙说出你用电脑干了什么事可是他的拿手好戏。我们就从这里开始吧!可是...用什么工具呢?PowerShell呀!就像我们上次介绍的,这个全新的命令行工具可以轻松地获取系统信息,接合.NET对象,管理后台任务,还能调用Excel等高级数据分析工具。数据记录、处理、呈现、挖掘一条龙服务,舍我其谁呢?

观察

整个时间记录的思路比较简单。电脑反正不怕麻烦,可以每过半分钟就来看看你在干啥。等一天结束的时候再把报表拿给你看就好。

可是问题来了,电脑怎么知道你是在上网,在写文档还是在写代码呢?哈,对于PowerShell来说,这个可简单了。还记得PowerShell中传递的是一个个对象吗?其中每个命令返回的都是含有丰富信息的对象,我们可以大加利用。至于怎么知道每个对象有哪些属性,可以用get-member这个函数来查看。比如Get-process可以得到当前所有进程,我们可以用get-process | get-member来查看“进程”有哪些属性属性。当然由于ps是get-process的alias,我们也可以用ps | get-member来查看。

复制代码 代码如下:

Name                       MemberType     Definition
----                       ----------     ----------

... ...

MainModule                 Property       System.Diagnostics.ProcessModule M...

MainWindowHandle           Property       System.IntPtr MainWindowHandle {get;}

MainWindowTitle            Property       System.String MainWindowTitle {get;}

MaxWorkingSet              Property       System.IntPtr MaxWorkingSet {get;s...

MinWorkingSet              Property       System.IntPtr MinWorkingSet {get;s...

... ...

好多...一共有90个呢。注意到其中的MainWindowTitle了吗?这个就是该进程主窗口的标题。让我们用ps | ? {$_.MainWindowTitle} | select MainWindowTitle来看看当前系统主窗口的标题是什么:

复制代码 代码如下:

MainWindowTitle

---------------

Start Page - Microsoft Visual Studio

Computing Life - 博客园 - Windows Internet Explorer

你的C:\>能干啥?(1) -- 用PowerShell打造时间管理小秘书 - Microsoft Office One...

Untitled - Message (HTML)

Windows PowerShell

Windows Task Manager

Document1 - Microsoft Word

恩恩,能看出来不少东西呢。比如说在用IE浏览博客园,在用Word写文档,在用Visual Studio写代码等等。还真得感谢这些软件的设计者,把软件的名字都放在窗口的标题上了,否则我们的统计还挺有难度。下面的事情就简单了,我们可以用正则表达式匹配每个标题,比如含有Internet Explorer的就是在上网,含有Visual Studio的说明在写代码等等。只要定时来统计一下,一天有多长时间上网,多长时间写代码就很容易算出来了。

记录

至此“观察”这一步算是解决了。可是怎么“记录”呢?这个也挺简单,用个数组就搞定,每次查看如果发现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:\temp\timeRecord.txt}
}

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

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

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

复制代码 代码如下:

Id              Name            State      HasMoreData     Location

--              ----            -----      -----------     --------

5               Job5            Running    True            localhost

而在此过程中,我们可以通过get-content d:\temp\timeRecord.txt命令来了解时间使用情况。也可以用job管理命令如stop-job来停止任务,get-job来观察任务,receive-job来接收输出等。

等下等下,不对呀,我们难道不能直接显示$record吗?让我们来试一下。键入$record,回车,咦?怎么没有结果?

这是因为PowerShell这种脚本语言中变量也是有作用范围(scope)的。脚本中的$record只在脚本中有效,我们在全局(global)范围内当然就看不到它啦。可是脚本就不能写入全局变量了吗?当然可以。我们可以将调用命令做一点小小的改动,变成. c:\users\grapeot\Monitor.ps1,注意前面的这个点和空格,以及这里暂时没有用start-job而是直接执行。等运行一会以后按Ctrl+C结束脚本,键入$record看看,结果出来了吧~这个". "叫做dot sourcing,利用它我们可以让脚本或函数直接读写全局变量。当然还有一种方法是用set-variable命令加上-scope参数来读写。具体使用方法可以用help set-variable -parameter scope命令查询。

但是这两个特性在后台job中似乎有点失效。如果用dot sourcing启动脚本的话这个job直接就吊死了,状态是Running但实际上得不到运行。Microsoft说这是由于叉叉过程造成死锁捣的鬼。如果用set-variable对全局变量赋值的话还是无法用$record观察到结果。据推测可能是后台运行的会话和当前会话是彼此独立的,因此没有办法共享变量。看来要想在后台任务和当前会话中传递数据,还只能通过Receive-Job或者临时文件了呢。如果各位有什么高招的话还请赐教呀~

呈现与挖掘

一天结束了,我们也拿到了一个统计表,比如

复制代码 代码如下:

Name                           Value

----                           -----

编程                           5869

文档                           3217

上网                           3078

我们可以利用上篇文章中介绍的脚本把它画成一个饼图,当然也可以把每天的记录保存下来,画成一周状态走势图。

你可以做更多…

每个人都有自己的生活自己的电脑自己的习惯,根据自己的需求动手打造自己的工具其实也是挺有成就感的一件事。而PowerShell很适合作为打造的基础。除了用电脑监控时间利用情况以外,你当然可以做得更多。比如更详细的统计浏览器记录,看自己经常去哪些网站;观看Google Reader的阅读率统计,退订那些不必要的Feed;甚至用手机做一些简单的工作,比如用计步器软件统计一天运动了多少,用GPS软件统计自己在上班路上耽搁了多久,看看自己和谁打电话的时间是不是太长了等等。有时候很简单甚至很裸的算法都能带来神奇的发现。

其实这篇文章的目的并不在于炫耀PowerShell怎样能干,而是想强调“记录”这个习惯的重要性。只是用PowerShell来实现相对简单而已。对于追求完美或者不喜欢命令行的人,当然也可以自己写个系统服务,效果都是一样的。

所以说,数据就是价值。让我们用DIY精神去发掘生活中与我们擦肩而过的价值吧!

时间: 2024-08-19 01:19:52

PowerShell实现时间管理小秘书_PowerShell的相关文章

Windows PowerShell时间管理小秘书

时间管理就是用最少的时间做最多的事.和优化程序的性能一样,为了提升时间的利用率,得先知道自己的时间都花在什么地方.如果上班时间有50%都浪费在琐事上,剩下的一半时间再集中精力,一天的成效也好不到哪去.相应的,如果90%的时间都在干活,相比于竭力缩小剩下的走神时间,反不如稍稍提高一点效率.射箭强调有的放矢,治病讲求对症下药.知晓瓶颈所在是优化的前提. 那么如何知道自己的弱点在什么地方?记录,养成记录的习惯. 试想当一周结束,你看到一张统计表:这周加班5小时,所有http://www.aliyun.

Powershell小技巧之获取当前的时间并转换为时辰_PowerShell

午时三刻已到,行刑,刀下留人,现在到底是不是午时,能否让PowerShell告诉我呢? 好的, 没问题.从晚上23点到凌晨2点之间属于子时,每两个小时一个时辰,依次为"子丑寅卯辰巳午未申酉戌亥". 函数获取当前时辰 用PowerShell脚本实现: function Get-ChinaTimeAlias { param( [ValidateRange(0,23)] [int]$Hour = (get-date).Hour ) $timeAliasArray='子丑寅卯辰巳午未申酉戌亥'

聊天机器人是一场真正的革命?未来将成为私人小秘书

著名的网络媒体"BackChanel"日前撰文称,聊天机器人作为一项热门的技术,将会颠覆手机应用(APP),在个人生活.公司客服.政府服务方面都有很好的应用. 文章将此称为即将到来的"真正革命".未来,聊天机器人可以成为你的私人小秘书. 开通支付功能后,"脸谱"聊天机器人或能帮助商家做电商生意. "脸谱"独立聊天软件Messenger于9月中旬开通支付功能,业务负责人认为Messenger上的聊天机器人能帮助商家做好电商生意.

怎样有效的进行时间管理?

管理者要很好地完成工作就必须善于利用自己的工作时间.工作是很多的,时间却是有限的.时间是最宝贵的财富.没有时间,计划再好,目标再高,能力再强,也是空的.时间是如此宝贵,但它又是最有伸缩性的,它可以一瞬即逝,也可以发挥最大的效力.对于生产和商业活动来,就是潜在的资本.在工业史上,经常有这样的事情:仅仅是一天之差,就可以导致一个企业的巨大成功和另一企业的倒闭破产. 所以,不懂得利用时间就是最无能的管理者.浪费时间就等于浪费企业的财富. 会不会利用时间不是单纯地看工作时间内是否充满了各种工作.有很多管

个人管理/时间管理 辅助工具套件分享

    作为一个开发人员,个人管理这些软件技能可以说和开发技能一样重要.     之前写了一篇<PDA感悟>(还有<脑子是用来想事的,不是记事的>),主要是对过去一年来使用PDA来进行GTD和个人管理的情况进行总结.在公司里,和组内的同事们进行了分享,最后还拿了个"反思奖".他们提出要求要我进一步分享我个人做时间管理的模板和小工具.这里我把这些东西打了一个包,顺便发上来和园友们进行一个分享.     主要包含: 计划模板(月模板/周模板/任务管理模板) 小工具组

【PMP】PMBOK 笔记 第6章 项目时间管理

第6章 项目时间管理 进度模型 -> <进度计划实践标准> 通过把填有项目数据的进度规划工具看做进度模型,可以把项目进度的呈现形式(进度计划)与产生项目进度计划(见 6.6.3.2 节)的进度数据(见 6.6.3.3 节)和计算工具区分开来. 进度规划方法包括关键路径法(CPM)和关键链法(CCM). 总结 本章的重点是6.6和6.7. 6.1 规划进度管理 规划进度管理是为规划.编制.管理.执行和控制项目进度而制定政策.程序和文档的过程. 进度管理计划是项目管理计划的组成部分. 6.1

数据 我的理科生小秘书

ZDNet至顶网软件频道消息:还记得十年前,有电视直播就守着电视.没转播就苦守比分板的复古观赛年代么?已一去不复返.我现在看球的"硬件配置"是这样的:一边看着电视或Ipad上的直播画面,一边瞄着电脑或手机上的实时数据更新:比赛与数据,两手都要抓,两手都要硬. 本文作者张奔斗,国内最具影响力的网球记者.著名网球评论员. 作为一位从业已超过二十年的文字工作者,当年促使我走上文科生之路的,除了对文字的敏感之外,恐怕还有对数字的钝感.不过,数据可是体育报道的重要组成部分:但谢天谢地,好在我有拥

时间管理这事对很多人来说都是难事

"我拖延-到最后一刻才拼命把事情做完." "有时候我会把一天的事情塞得太满而倍感压力--" 上面说的是你吗? 时间管理这事对很多人来说都是难事,特别在这个注意力不容易集中容易频繁切换屏幕和工作任务的今天,再好的GTD产品好像都不能满足我们了.当时间管理这事成了很多人膝盖上的伤,一款叫Timeful的智能时间管家可能有机会出来治疗一下.这产品还没推出,却已经拿了700万美元的A轮融资,投资机构包括了Khosla Ventures.KPCB等. 这个卖关子的app到底是

给考研亲学生:用时间管理让自己找到状态

[来信] 贺老师: 您好! 我准备走考研的道路,目标是北京某985大学,这并不简单,而且去年考研的形势很不乐观,一大批学长学姐想考好学校都没能如愿.对于差不多开始准备考研的我来说,压力很大.但我最主要的烦恼还是,下不了置之死地而后生去考研的觉悟,调整不了自己的心态. 我觉得主要还是与我自身的成长经历有关.我是一个小城镇的非常普通的家庭孩子,很少有机会接触更广阔的世界,一个很简单的例子,我2014年考上烟大,当时还是村里第一个考过一本线的大学生,就像是九十年代的电视剧情.来到大学就立马感受到自己与