2009年1月9日 星期五

[Script] 自動預約備份資料 -- PowerShell

下班時,  我希望電腦自動把重要資料壓縮備份起來, 該怎麼做呢?
powershell_schedule_tasks
想做這件事, 只要寫一個簡單的 Script 向 schtasks.exe 預約工作即可.
任何可以在 Windows 上執行的 Script 語言都可以完成這項工作. 例如: bat 檔. 當然你也可以用 Python 完成這項工作.

不過, 今天我想介紹 PowerShell  script 的作法.
本文重點:
             1. 如何預約工作?
             2. 如何修改 Path 搜尋路徑, 讓程式可以被搜尋?
             3. 如何啟動特定的程式?
             4. 如何在批次檔 (bat 檔) 呼叫 PowerShell ps1 檔?
             5. 完整範例程式下載

如果一次看程式碼, 我保證會很痛苦, 所以有些事情要先交代一下.
1. 如何預約工作?
只用使用 schtasks /create 就可以向 Windows 預約一個工作. 這種東西叫做 schedule (排程).
語法:
schtasks /create /sc ONCE /st 啟動時間/tn 工作名稱 /tr "執行工作指令"
範例: 
     預約下午 2:23 分, 自動開啟 notepad 程式的作法
     schtasks /create /sc ONCE /st 14:23:00 /tn "Task" /tr "notepad.exe"

你可以直接在 cmd.exe 命令列執行看看, 他真的會動!!

更多的排程選項:
http://msdn.microsoft.com/en-us/library/bb736357(VS.85).aspx

2. 如何取得命令列的參數 (PowerShell)?
範例:
                   param ([switch] $schedule)
呼叫方式:
                    ps c:\>00_backup.ps1 -schedule

3. 如何讓程式 pause 顯示處理結果 (PowerShell)?
請參考: http://blogs.msdn.com/powershell/archive/2007/02/25/pause.aspx

4. 如何啟動特定的程式 (PowerShell)?
語法:    
      $cmd = "& '執行檔.exe' "    # 一定要有 &
      Invoke-Expression  $cmd
範例:
      # 呼叫 7z.exe 把 c:\test 目錄, 壓成 test.7z
      $cmd = "& 'C:\Program Files\7-Zip\7z.exe' a -t7z -mx=3
                       c:\test.7z c:\test\"

       Invoke-Expression  $cmd

5. 如何修改 Path 搜尋路徑, 讓程式可以搜尋的到 (PowerShell) ?
   PowerShell 範例:
         #暫時加到 PATH (只有目前 cmdlet 有效)
         $env:path +=";C:\Program Files\7-Zip\"

   Dos 的作法:
         :: 暫時加到 PATH (只有目前 cmd.exe 有效)
         set PATH=%PATH%;C:\Program Files\7-Zip\
  
   固定寫入系統 PATH, 反應所有的程式:
          SetEnv -a PATH %%"C:\Program Files\7-Zip
   (SetEnv.exe 請到下面網址下載)
   http://www.codeproject.com/KB/applications/SetEnv.aspx

6. 如何切換執行路徑 (PowerShell)
pushd (split-path -parent $myinvocation.mycommand.definition)
恢復目前路徑: popd

7. 如何在批次檔 (bat 檔)呼叫 PowerShell ps1 檔?
這樣我們就可以用滑鼠直接在 bat 檔上 Double-Clicked, 立刻執行我們的 PowerShell 而不動任何鍵盤.
  語法:
          powershell -command "& 'PowerShell ps1 程式檔' -參數"
  範例: 
           # 呼叫 00_backup.ps1 -schedule 的作法
             powershell -command "& './00_backup.ps1' -schedule "

完整範例程式下載
       重要程式碼片段: 00_backup.ps1       完整範例: schedulebackup.zip
       程式使用方式:
                  Step 1: 下載 schedulebackkup.zip
                  Step 2: 滑鼠 Double-Clicked
                                  00_backup_dos_lunch.bat
                  Step 3:  Enjoy!
        程式行為:
               1 分鐘後, 程式會自動將目前目錄下的 test1 test2 目錄進行壓縮.


補充資料:
  foreach 指令範例:
------------------------------------ code --------------------------------------
   $source_collection="docs", "Work2", "00_svn_root", "test", "Work",
                                          "重要傳送檔"
    foreach($i in $source_collection){
        $cmd = "& '7z.exe' a -t7z -mx=3 "+
                         $BackupToWhichDirectory+$i+".7z" +" "+$i+"\"
        write-host $cmd
        Invoke-Expression  $cmd
    }
------------------------------------------------------------------------------------

Enjoy by Jing.

參考資料:
[1] Powershell script that can schedule itself to run later
http://blogs.msdn.com/mwilbur/archive/2007/02/23/powershell-script-that-can-schedule-itself-to-run-later.aspx
[2] 允許在 Dos 啟動 powershell 指令
http://www.searchmarked.com/windows/how-to-schedule-a-windows-powershell-script.php

3 則留言:

  1. 不好意思
    那個code似乎下載不下來
    不知道你那邊還有沒有
    因為我最近在學習
    用powershell建立windows task
    所以需要一些參考範例
    如果可以
    可以請您寄到
    whocares19880516@gmail.com
    這個信箱嗎
    謝謝!!

    回覆刪除
  2. 不好意思
    那個code似乎下載不下來
    不知道你那邊還有沒有
    因為我最近在學習
    用powershell建立windows task
    所以需要一些參考範例
    如果可以
    可以請您寄到
    whocares19880516@gmail.com
    這個信箱嗎
    謝謝!!

    回覆刪除
  3. Hi friend,

    Please check the following link, https://github.com/jing-tw/lab-ps-schedule.

    Enjoy!
    Jing.

    回覆刪除