赞
踩
PowerShell与WMI框架完全集成,而WMI框架对于查找Windows系统详细信息来说是很强大的方式。传统访问WMI并不容易,因为这主要通过程序界面来实现。PowerShell开启访问WMI使得它成为对排错很有用的资源。
查询磁盘空间使用率
在这个例子中,你将会看到如何利用WMI win32-logicaldisk类来获取服务器的磁盘空间使用率的信息。开始时,该类会返回原始信息,然后会利用数据去生成可用磁盘空间的细节分析:
Get-wmiobject win32_logicaldisk
运行Get-WmiObject并提供win32_logicaldisk类,将会返回计算机的如下结果:
DeviceID : C:
DriveType : 3
ProviderName :
FreeSpace : 105582891008
Size : 128742060032
VolumeName :
DeviceID : D:
DriveType : 5
ProviderName :
FreeSpace : 0
Size : 45471744
VolumeName : VBOXADDITIONS_4.
这输出默认的列表视图可读性不高,但是你可以通过格式化成表来改进它:
Get-wmiobject win32-logicaldisk | format-table -autosize
这时输出就会类似下面的结果:
DeviceID DriveType ProviderName FreeSpace Size VolumeName
-------- --------- ------------ --------- ---- ----------
C: 3 105582891008 128742060032
D: 5 0 45471744 VBOXADDITIONS_4.
你或许想过滤信息,仅显示固定的磁盘。这可以通过Filter参数来实现:
Get-WmiObject Win32_logicaldisk -Filter "DriveType = 3" | Format-Table -autosize
这渐渐好转,但是结果显示的是可用空间和以字节为单位的大小。你可以修改脚本,把输出格式化为GB(代码文件:PS_DiskInfo01.PS1):
$diskinfo = Get-WmiObject Win32_logicaldisk -Filter "DriveType = 3"
$diskinfo | foreach-object {$_.FreeSpace = $_.FreeSpace / 1GB; '
$_.Size = $_.Size / 1GB}
$diskinfo | format-table -autoSize
查询当前Server的活动
检查一台远程计算机是否响应,首先可以检查ping响应。使用WMI类win32_pingstatus会非常简单。该类返回的数据是结构化的,它能够用于调查其他部分,或记录到磁盘文件中,e-mail给接收者,或存放在数据库。下面的例子检查ping测试的状态代码(0表示成功):
Get-WmiObject win32_pingstatus -Filter "Address='SQL2012'" '
| Select-Object statuscode
假设返回的状态代码是0,那么你就可以把注意力转向计算机上正在运行的服务。执行如下命令可以看到正在运行的服务:
Get-Service | Where-Object { $_.Status -eq 'Running' }
对于简单的服务查询,使用Get-Service会很方便。不幸的是,它不提供访问服务的每个属性。查看服务状态及启动模式很有用。幸运的是,该信息可以使用WMI类Win32-Service来获取,下面的脚本是显示查询该类的例子,它能够找出自动启动但当前是停止的服务:
Get-WmiObject -Class Win32_Service -Property Name,State,StartMode -Filter
"StartMode='Auto' AND State='Stopped'" '
| Select-Object -Property Name,StartMode,State
在排错时找出哪些进程是活动的是很有用的。通常,一个进程耗完CPU或内存,因此会施压给系统,引起其他关键的服务急需资源。PowerShell通过Get-Proces立即去营救,返回进程信息。一个繁忙的系统有很多正在运行的进程,所以我喜欢运行2个查询,第一个找出前10个CPU使用最高的进程,第二个超出前10个内存使用最高的进程,如下:
PS C:\> get-process | Sort-Object CPU -Descending | Select-Object -First 10
PS C:\> get-process | Sort-Object WS -Descending | Select-Object -First 10
查询警告和错误信息
当Server异常时,常会发生错误。调查Windows事件日志是调查哪里出错的第一步。PowerShell完全支持Windows事件日志。Get-EventLog会罗列一个事件日志中所有条目。下面的例子显示了源为MSSQLSERVER且是错误类型的条目列表:
Get-Eventlog application '
| Where-Object {$_.Source -eq "MSSQLSERVER" -and $_.EntryType -eq "Error"}
SQL Server也会有错误日志,常常包含有关SQL Server特定问题的详细信息。下面的例子显示了如何查询SQL Server错误日志并过滤出类型为错误的结果(PS_ReadSQLErrorLog01.PS1):
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
$server = New-Object "Microsoft.SqlServer.Management.Smo.Server" "(local)"
$server.ReadErrorLog() | Where-Object {$_.Text -like "Error:*"}
我的本地只有一个默认的SQL Server实例,如果你使用一个命名的实例,要把“(local)”换成SQL Server实例名称。
使用SQL Server Management Objects也能很快过滤可用的Job,识别出那些最后一次失败的并且是开启状态的Job。下面的脚本显示了如何查询SMO对象,来获取运行失败但处于开启状态的Job(代码文件:PS_ReadFailedJobs01.PS1):
[reflection.assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | out-null
$server = New-Object "Microsoft.SqlServer.Management.Smo.Server" "(local)"
$server.jobserver.jobs | where-object {$_.lastrunoutcome -eq "Failed" -and
$_.isenabled -eq $TRUE}
查询Server性能
PowerShell 2.0和Windows性能计数器集成了。这意味着你可以快速查看所有的性能计数器:
Get-Counter -listSet * | Select-Object -ExpandProperty Paths
然后你可以找出SQL Server特定的计数器:
Get-Counter -listSet * | Select-Object -ExpandProperty Paths | where-object {$_ -like "*SQL*"}
也可以获取一个性能计数器的一个样本:
Get-Counter '\Processor(*)\% Processor Time'
你甚至可以让PowerShell侦听计数器并收集样本,直到你按下CTRL+C:
Get-Counter '\Processor(*)\% Processor Time' -continuous
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。