你的C:\>能幹啥?(1) — 用PowerShell打造時間管理小秘書

來源:互聯網
上載者:User
引言

    是不是覺得同樣是活著,別人為啥就能做這麼多事呢?

    是不是經常8小時班上下來,卻不曉得自己幹了些啥?

    是不是習慣於在Email, BBS, Google Reader間切換,感覺也挺忙的呢?

    你需要時間管理

    你知道自己一天寫了多少代碼嗎?

    你瞭解自己一周有多少時間在網上遊盪嗎?

    你能說出一個月有幾天陪著家人嗎?

    你需要PowerShell

     

管理?先記錄!

    時間管理就是用最少的時間做最多的事。和最佳化程式的效能一樣,為了提升時間的利用率,得Crowdsourced Security Testing道自己的時間都花在什麼地方。如果上班時間有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寫代碼等等。還真得感謝這些軟體的設計者,把軟體的名字都放在視窗的標題上了,否則我們的統計還挺有難度。下面的事情就簡單了,我們可以用Regex匹配每個標題,比如含有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還可以做一些更有意義的工作,比如簡單的資料採礦和警示。當最近2小時的上網時間超過50%時自動彈出警告,當滯留在Google Reader上太久時強行將其關閉,當本周新出現某個視窗且這個視窗佔用時間多於20%時自動提醒...還有很多記錄和挖掘的空間等著我們去探索,而PowerShell在我們的打造下完全可以成為最貼心的秘書。

     

你可以做更多…

    每個人都有自己的生活自己的電腦自己的習慣,根據自己的需求動手打造自己的工具其實也是挺有成就感的一件事。而PowerShell很適合作為打造的基礎。除了用電腦監控時間利用情況以外,你當然可以做得更多。比如更詳細的統計瀏覽器記錄,看自己經常去哪些網站;觀看Google Reader的閱讀率統計,退訂那些不必要的Feed;甚至用手機做一些簡單的工作,比如用計步器軟體統計一天運動了多少,用GPS軟體統計自己在上班路上耽擱了多久,看看自己和誰打電話的時間是不是太長了等等。有時候很簡單甚至很裸的演算法都能帶來神奇的發現。

    其實這篇文章的目的並不在於炫耀PowerShell怎樣能幹,而是想強調“記錄”這個習慣的重要性。只是用PowerShell來實現相對簡單而已。對於追求完美或者不喜歡命令列的人,當然也可以自己寫個系統服務,效果都是一樣的。

    所以說,資料就是價值。讓我們用DIY精神去發掘生活中與我們擦肩而過的價值吧!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.