介紹最近這兩天學到的好用 DOS 指令。

工作上有些排程我還是習慣靠 DOS 批次檔解決,雖然這年頭 PowerShell 已是 Windows 管理腳本的主流,但批次檔簡單易上手,串接執行檔或 DOS 內建作業,例如:COPY、ROBOCOPY、7Zip...,不花太多腦筋三兩下便搞定。因此批次檔老歸老,念在其系統內建不必安裝,直覺易懂還支援 IF ELSE GOTO 等流程,是我組裝簡單批次動作的首選。

實務上我遇一個困擾,就是批次作業出錯依慣例應回傳非零 Exit Code 告知作業系統作業失敗。常用的排程管理工具有兩種:SQLAgent 可設定作業成功失敗之後續動作,彈性大,執行歷程查詢也清楚;Windows 工作排程器免安裝,但在功能與介面上差一些。有個明顯差異便是當批次檔回傳 Exit Code > 0 時,SQL Agent 會顯示顯目的紅色圖示:

而工作排程器顯示的仍是「動作已完成」,必須開啟事件才能看到「傳回碼為255」字樣,不符直覺:

我想到的解法是在批次作業失敗時寫入錯誤事件,如此用事件檢視器可快速找到執行錯誤記錄。寫入 Windows 事件對 .NET、VBScript、PowerShell 都是小事,那批次檔呢? Windows 有個少為人知的小程式( Windows XP 時代就有了) - EventCreate.exe,足以擔當重任。EventCreate.exe 的參數如下:參考

  
/S system要連接的遠端系統
/U [domain]user執行身分帳號
/P [password]執行身分密碼,未提供時會提問
/L logname事件簿,Application 或 System,一般我們會選 Application
/T type事件類別:SUCCESS, ERROR, WARNING, INFORMATION
/SO source事件來源,不存在時會自動新增來源(需管理者權限)。未指定時為"eventcreate"
/ID id事件識別碼,介於 1 - 1000 的數字
/D description事件說明

【應用範例】建立一筆事件代碼 255,事件來源為 BatchJob 的應用系統錯誤事件:

eventcreate /l Application /t Error /id 255 /so BatchJob /d "Error Event Test"

這裡有個眉角:當執行身分非管理者,建立事件可能會遇到「存取被拒」錯誤。原因是當 EventCreate 發現沒用過的事件來源會先向 Windows 註冊,而註冊來源需要管理者權限。

最簡單的解決方法是先用管理者帳號建立一筆該事件來源的資訊事件:

eventcreate /l Application /t Information /id 1 /so BatchJob /d "Create Error Source"

上述指令只需執行一次,事件來源一旦建立,之後一般使用者便能自由建立屬於該來源的事件。

同場加映

針對特定事件來源、事件代碼,可用來觸發特定排程作業。做法是在特定事件按右鍵選「附加工作到此事件.../Attach Task To This Event...」:

鎖定事件類別、事件來源、事件代碼:

下一步可安排要觸發的程式或寄送郵件:

結合前述在批次檔寫入事件的技巧,可玩一些花式應用。

Tips of how to use EventCreate.exe in batch file and attaching task to specific event.


Comments

Be the first to post a comment

Post a comment