上一次我们对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 |
进程正在使用的非分页内存量,以千字节为单位 |
PM |
进程正在使用的可分页的内存量,以千字节为单位 |
VM |
进程正在使用的虚拟内存量,以兆字节为单位。虚拟内存包括磁盘上分页文件中的存储 |
WS |
进程工作集的大小,以千字节为单位。工作集包括进程最近引用的内存的页面 |
查看占用分页内存最多的前10个进程:
Get-Process | SortPM-Descending | Select-First 10
运行结果:
获取所有占用 > 50 MB的进程,并倒排序:
Get-Process | Where {$_.WS -gt 50MB} | SortWS�CDescending
运行结果:
在PowerShell 2.0中,还可以查看远程计算机上的进程。
如下图所示,虚拟机中计算机的IP为:192.168.200.132:
Get-Process-ComputerName192.168.200.132
运行结果:
开启一个进程。在PowerShell 2.0中,可以在本地计算机上使用Start-Process来启动一个进程:
Start-Processiexplore.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-ProcessWINWORD).MainModule
运行结果:
获取Excel进程依赖的库信息
Start-ProcessEXCEL
(Get-ProcessEXCEL).Modules
Stop-Process-NameEXCEL
运行结果:
获取进程的元数据:
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-ProcessWINWORD
Write-Host$process.PriorityClass
$process.PriorityClass="High"
Write-Host$process.PriorityClass
运行结果:
可见,Word的优先级由Normal变为了High。
5、调试进程:
Debug-Process-NameWINWORD
会弹出提示窗口选择调试器:
等待进程结束
Wait-Process-Namenotepad
脚本输入窗口会一直等待,直到该进程结束后才可以继续输入:
关闭记事本窗口后:
小结:
本次对Windows进程进行了简单的管理操作,相比Windows服务来说进程管理略显单一,主要是查看进程与设置进程优先级,但是重要性是一样的。进程和服务是Windows的基础功能,维系着运行的程序,如果设置不当可能会引起系统不稳定。此外,PowerShell 2.0增强了远程处理能力,方便了远程管理操作。下一次我们来关注一下注册表的相关操作。