利用PowerShell來為你的網站進行自動化工作

Web Application最大的問題就是無法自動化,因為所有的觸發運行事件,均來自於前端的讀取、點擊、滑動事件。偏偏在現代化的開發環境中,萬事Web-Based已經是不用爭辯的事實,因此今天就來稍微介紹一下如何使用PowerShell來為你的網站增添自動化的功能。

在ASP.NET中若提到自動化,一定有很多人馬上提到Hanfire,但我的想法是能不裝第三方就不裝,且可能一件小小的事情不需要繞一大圈寫一大堆Code來完成。也有人會提到使用Microsoft Azure的WebJob、Functions來做,是很好沒錯啦,但這是要錢的 && 你人在台灣,你懂得...。

在這裡做個情境假設,假設你寫了一隻每天早上六點會自動統計昨日員工差勤狀態,並將結果發信給總經理的程式碼,名為「EmployeeClock.ashx」,那麼我們用最低的PowerShell + Windows排程技術,就可以辦到網頁/網站自動化了。

利用PowerShell與Windows排程來為你的網站程式自動化

Step 1. 撰寫下列的PowerShell程式碼,程式碼細節我就不多說了,你能夠寫統計差勤狀態的程式碼,我不信你看不懂這些簡單的CODE。

# 目標網址(測試時期可以用 http://httpstat.us/500 來調用 Http Status)
[uri]$cUrl = "http://slashlook.com/EmployeeClock.ashx"

# 取得狀態碼函式
function GetStatusCode ($cUrl)
{
  [int]$iStatusCode = -1
  try
  { 
    $oReq = Invoke-WebRequest $cUrl
    $iStatusCode = $oReq.StatusCode
  }
  catch
  { $iStatusCode = $_.Exception.Response.StatusCode.Value__ }
  return $iStatusCode
}

# 取得狀態碼
$iStatusCode = GetStatusCode($cUrl)

# 狀態碼不等於200就寄信
if ($iStatusCode -ne 200)
{
  $cSmtpServer   = "YourMailServer"
  $cEmailFrom    = "OfficialEmailAddress"
  $cEmailTo      = "YourEmailAddress"
  $cEmailSubject = "異常通知"
  $cEmailBody    = "您的員工差勤運算服務發生異常`n`n"
  $cEmailBody   += "動作主機:" + (Get-WmiObject Win32_ComputerSystem).Name + "`n"
  $cEmailBody   += "動作時間:" + (Get-Date -format "yyyy-MM-dd HH:mm:ss") + "`n"
  $cEmailBody   += "執行網址:" + $cUrl + "`n"
  $cEmailBody   += "回傳代碼:" + $iStatusCode + "`n"
  Send-MailMessage -SmtpServer $cSmtpServer -From $cEmailFrom -To $cEmailTo -Subject $cEmailSubject -Body $cEmailBody -Encoding ([System.Text.Encoding]::UTF8);
}

Step 2. 稍微說明一下這支PowerShell的運行功能:

  1. 基於某個網址,利用WebRequest定期去敲門。
  2. 定期的功能,交給Windows排程去處理就好,千萬不要再跳下去寫Windows Services。
  3. EmployeeClock.ashx利用Http Status來與PowerShell溝通,正常就是 HTTP 200,錯誤就是非 HTTP 200。
  4. 當不是 HTTP 200 時,PowerShell會發信給你講說,你慘了!快點去抓蟲。XD

Step 3. 將上方的PowerShell檔案儲存成「AutoExecution.ps1」,並假設存在「D:\」根目錄下。

Step 4. 開啟Windows排程,去新增一個排程可以用最高管理身分運行,在動作頁籤處,設定下列資訊:

動作:
啟動程式

程式或指令碼:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

新增引數:
-Command "& D:\AutoExecution.ps1"

大功告成,好好享受你的快樂人生吧。

ASP.NET ASPX ASHX AutoExecute AutoRun WindowsTaskScheduler