嗨,Scripting Guy!
歡迎使用 TechNet 專欄,Microsoft Scripting Guys 會在此為您解答有關系統管理指令碼的常見問題。您有關於系統管理指令碼方面的問題嗎?請將電子郵件傳送到 scripter@microsoft.com。我們無法保證能夠逐一回答每個問題,不過我們會盡力而為。
今天的問題:如何使用指令碼降低處理序的優先順序?
如何使用指令碼降低處理序的優先順序?
問 | 嗨,Scripting Guy!我要如何使用指令碼降低處理序的優先順序? -- HS |
答 | HS,您好。大家應該都知道,所有處理序在建立時,並非一視同仁,而是會指定優先順序值。高優先順序的處理序比低優先順序的處理序更常執行 (因此執行速度似乎較快)。譬如說,在系統處理序中執行的鍵盤與滑鼠就具有非常高的優先順序。不然每次敲擊鍵盤上的按鍵或移動滑鼠時,會發現有延遲的現象。 一般而言,多數處理序都以「標準」優先順序來執行,不快也不慢。這種機制運作得還不錯,不過,有時候您可能想要變更特定處理序的優先順序。例如,您可能想提高 X 處理序在夜間的優先順序,如此一來,就可以確保該處理序所執行的工作可以更快完成。反過來說,當 X 處理序在日間執行時,您可能想要降低其優先順序,這麼一來,此處理序便不會干擾正在電腦上執行的其他工作。以上是前情提要,實際開始變更處理序優先順序之前,顯然還有其他事項有待考量。但至少讓您對我們的主題有個概念。 假設您確定要變更處理程序的優先順序,可使用工作管理員輕鬆地完成這項工作,只要在處理序上按右鍵,選擇 [設定優先順序],然後設定以下其中一個可用選項:
只要您執行的是 Windows XP 或 Windows Server 2003,答案是肯定的 (對 Windows 2000 的使用者很抱歉,沒辦法)。這是因為在這些 Windows 版本中有一個 WMI 類別 Win32_Process,其中包含稱為 SetPriority 的方法,可讓您修改執行中處理序的優先順序。例如,以下指令碼將 Notepad.exe 的優先順序設為「標準以下」: |
Const BELOW_NORMAL = 16384
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
For Each objProcess in colProcesses
objProcess.SetPriority(BELOW_NORMAL)
Next
指令碼一開始會定義稱為 BELOW_NORMAL 的常數,並將值設為 16384;跟您想的一樣,我們稍後會使用這個常數,將記事本的優先順序變更為「標準以下」。有什麼其他值可用來指定不同的處理序優先順序嗎?當然有:
優先順序類別 | 值 |
標準 | 32 |
低 | 64 |
即時 | 128 |
高 | 256 |
標準以下 | 16384 |
標準以上 | 32768 |
建立常數之後,指令碼會連接到 WMI 服務,然後使用以下這行程式碼來擷取包含名稱 Notepad.exe 的所有處理序集合:
Set colProcesses = objWMIService.ExecQuery _
("Select * from Win32_Process Where Name = 'Notepad.exe'")
待集合傳回後,就只需使用 For Each 迴圈來循環 Notepad.exe 的所有執行個體 (在這個指令碼中,我們假設只有一個執行個體,但是萬一有多個執行個體,則全都要設為「標準以下」優先順序)。我們在該迴圈內呼叫 SetPriority 方法,將 BELOW_NORMAL 常數傳遞給唯一參數:
objProcess.SetPriority(BELOW_NORMAL)
只要查看 Notepad.exe 的優先順序 (使用指令碼或工作管理員),就會看到其優先順序為「標準以下」。
提醒您:在檔案伺服器上實際執行此指令碼之前,請考慮先在測試機器上嘗試各種優先順序。將記事本的優先順序變更成「標準以下」應該沒有大礙,但是將資料庫應用程式的優先順序變更成「標準以下」可能會造成使用者的困擾。同樣地,我們也不建議您將任何處理序的優先順序設為「即時」,這麼做的話,該處理序很可能會吞食所有系統資源,甚至阻止其他處理序 (包括重要的作業系統功能) 執行。這是好鄰居 Scripting Guys 給您的實用小叮嚀!
如需詳細資訊
回到頁首