上一次我們對Windows服務進行了簡單的管理,學習了擷取本地及遠端電腦上服務的方法,以及尋找特定服務,開始、結束、暫停、恢複服務等操作。本次我們來關注一下Windows管理中另一個核心內容:進程管理。
測試指令碼下載
本系列所有指令碼均在Windows Server 2008 R2 DataCenter (PowerShell 2.0) + PowerGUI Script Editor Free Edition x64中測試通過。
進程是作業系統結構的基礎,是一個正在執行的程式,是電腦中正在啟動並執行程式執行個體,可以分配給處理器並由處理器執行的一個實體。由單一順序的執行顯示,是一個由目前狀態和一組相關的系統資源所描述的活動單元。
PowerShell中與進程相關的命令主要有5個:
Get-Process
Start-Process
Stop-Process
Debug-Process
Wait-Process
- 首先來查看一下進程對象的成員:
Get-Process | Get-Member
運行結果:
可以看到,Get-Process返回的是.NET對象System.Diagnostics.Process的執行個體,其中有5個別名非常重要:
Handles |
進程開啟的控制代碼數 |
NPM |
進程正在使用的非分頁式記憶體量,以KB為單位 |
PM |
進程正在使用的可分頁的記憶體量,以KB為單位 |
VM |
進程正在使用的虛擬記憶體量,以MB為單位。虛擬記憶體包括磁碟上分頁檔案中的儲存 |
WS |
進程工作集的大小,以KB為單位。工作集包括進程最近引用的記憶體的頁面 |
查看佔用分頁記憶體最多的前10個進程:
Get-Process | Sort
PM
-Descending | Select
-First 10
運行結果:
擷取所有佔用 > 50 MB的進程,並倒排序:
Get-Process | Where {$_.WS -gt 50MB} | Sort
WS
–Descending
運行結果:
在PowerShell 2.0中,還可以查看遠端電腦上的進程。
如所示,虛擬機器中電腦的IP為:192.168.200.132:
Get-Process
-ComputerName
192.168.200.132
運行結果:
- 開啟一個進程。在PowerShell 2.0中,可以在本機電腦上使用Start-Process來啟動一個進程:
Start-Process
iexplore.exe
Start-Process只能用於本機電腦。
運行結果:
注意,預設會啟動32位的程式,如果想啟動64位的程式,需要添加-FilePath參數,指明64位程式所在位置:
Start-Process
-FilePath
"C:\Program Files\Internet Explorer\iexplore.exe"
運行結果:
- 結束進程。
首先啟動一個記事本進程,並記錄下來,接著線程休眠3秒,然後結束該進程:
$notepad
= [System.Diagnostics.Process]::Start("notepad")
[System.Threading.Thread]::Sleep(3000)
Stop-Process
-Id
$notepad.Id
運行結果:
3秒後記事本會自動關閉。
4、擷取Word進程所在的目錄資訊:
(Get-Process
WINWORD).MainModule
運行結果:
擷取Excel進程依賴的庫資訊
Start-Process
EXCEL
(Get-Process
EXCEL).Modules
Stop-Process
-Name
EXCEL
運行結果:
擷取進程的中繼資料:
Get-Process | Select Company,Product,ProductVersion
運行結果:
Google Chrome的版本號碼居然沒有被正確識別J
設定進程優先順序:
每個進程都有相應的優先順序,優先順序決定它何時運行和接收多少 CPU 時間。最終的優先順序共 32 級,是從 0 到 31 的數值,稱為基本優先順序別(Base Priority Level)。系統按照不同的優先順序調度進程的運行,0-15 級是普通優先順序,進程的優先順序可以動態變化,高優先順序進程優先運行,只有高優先順序進程不運行時,才調度低優先順序進程運行,優先順序相同的進程按照時間片輪流程執行。16-31 級是即時優先順序,即時優先順序與普通優先順序的最大區別在於相同優先順序進程的運行不按照時間片輪轉,而是先啟動並執行進程就先控制 CPU,如果它不主動放棄控制,同級或低優先順序的進程就無法運行。
可由PriorityClass屬性讀寫,有效值列表:Normal, Idle, High, RealTime, BelowNormal, AboveNormal。
$process
=
Get-Process
WINWORD
Write-Host
$process.PriorityClass
$process.PriorityClass
=
"High"
Write-Host
$process.PriorityClass
運行結果:
可見,Word的優先順序由Normal變為了High。
5、調試進程:
Debug-Process
-Name
WINWORD
會彈出提示視窗選擇調試器:
等待進程結束
Wait-Process
-Name
notepad
指令碼輸入視窗會一直等待,直到該進程結束後才可以繼續輸入:
關閉記事本視窗後:
小結:
本次對Windows進程進行了簡單的管理操作,相比Windows服務來說進程管理略顯單一,主要是查看進程與設定進程優先順序,但是重要性是一樣的。進程和服務是Windows的基礎功能,維繫著啟動並執行程式,如果設定不當可能會引起系統不穩定。此外,PowerShell 2.0增強了遠端能力,方便了遠端管理操作。下一次我們來關注一下註冊表的相關操作。