使用Powershell解析RSTCLI的卷状态

时间:2014-09-23 19:50:41

标签: powershell intel hyper-v

我正在尝试使用PowerShell解析rstcli64(英特尔快速存储技术命令行界面)的输出,以便与Hyper-v 2012裸机服务器配合使用。目标是找到状态不是“正常”的任何卷或磁盘,通过为'OK'返回$ true或为除正常或$ null之外的任何内容返回$ false。最终目标是为Icinga创建警报。完成后我将发布工作脚本。这就是我所处的位置,我可能会以完全错误的方式解决这个问题:

我从rstcli64开始:

rstcli64 --information --volume

哪个输出:

--VOLUME INFORMATION--

Name:              Volume0
Raid Level:        10
Size:              466 GB
StripeSize:        64 KB
Num Disks:         4
State:             Normal
System:            True
Initialized:       False
Cache Policy:      Off

--DISKS IN VOLUME: Volume0 --

ID:                0-0-0-0
Type:              Disk
Disk Type:         SATA
State:             Normal
Size:              233 GB
Free Size:         0 GB
System Disk:       False
Usage:             Array member
Serial Number:     WD-WCAT1F483065
Model:             WDC WD2502ABYS-18B7A0                   

ID:                0-1-0-0
Type:              Disk
Disk Type:         SATA
State:             Normal
Size:              233 GB
Free Size:         0 GB
System Disk:       False
Usage:             Array member
Serial Number:     WD-WCAT1F468139
Model:             WDC WD2502ABYS-18B7A0                   

ID:                0-2-0-0
Type:              Disk
Disk Type:         SATA
State:             Normal
Size:              233 GB
Free Size:         0 GB
System Disk:       False
Usage:             Array member
Serial Number:     WD-WCAT1H077856
Model:             WDC WD2502ABYS-18B7A0                   

ID:                0-3-0-0
Type:              Disk
Disk Type:         SATA
State:             Normal
Size:              233 GB
Free Size:         0 GB
System Disk:       False
Usage:             Array member
Serial Number:     WD-WCAT1F522503
Model:             WDC WD2502ABYS-18B7A0                   


rstcli64 : 
    + CategoryInfo          : NotSpecified: (:String) [], RemoteException
    + FullyQualifiedErrorId : NativeCommandError

0

我对'State:'条目退出的任何地方感兴趣所以我用Select-String过滤掉了,我正在使用这个输出:

rstcli64 --information --volume 2> Out-Null | select-string -Pattern "State:"

State:             Normal
State:             Normal
State:             Normal
State:             Normal
State:             Normal

......这就是我所知道的。我需要找出返回$ true如果所有的“State:”字段-eq为“Normal”,如果没有输出则为$ false($ null我假设)或者如果有任何“州:” - “正常”。

非常感谢任何帮助。谢谢。

编辑:谢谢你的帮助!这就是我最终使用TheMadTechnician的逻辑:http://baremetalwaveform.com/?p=311

2 个答案:

答案 0 :(得分:2)

嗯,这很容易就可以从你所在的地方做到。运行一个RegEx匹配或运行-like,看看是否有任何-match或-like并查找' Normal'。获取一个计数,如果状态-gt 0和该计数的总数-eq匹配计数,那么您将全部设置。

$Status = rstcli64 --information --volume 2> Out-Null | select-string -Pattern "State:"
If(($status.count -gt 0) -and ($status.count -eq ($status|Where{$_ -match "Normal"}).count)){
    "All is well"
}else{
    "Stuff be broke!"
}

答案 1 :(得分:1)

另一种捕捉状态计数的方法

$states = rstcli64 --information --volume 2> Out-Null | select-string -Pattern "State:"
$notNormalStates = $states | Select-String -Pattern "Normal" -NotMatch
if ($state.Count -gt 0 -and $notNormalStates.Count -eq 0){
    Write-Host "Everything Ok"
} Else {
    Write-Host "Something Wrong"
}

您可以再次将Select-String的结果导入Select-String并吐出没有“正常”的结果。如果您只对非正常状态计数感兴趣,可以使用以下任一方法。

$notNormalCount = (rstcli64 --information --volume 2> Out-Null | select-string -Pattern "State:" | Select-String -Pattern "Normal" -NotMatch).Count

另外,你可以正则表达式只有一个Select-String cmdlet

$notNormalCount = (rstcli64 --information --volume 2> Out-Null | Select-String -Pattern "State:\s+(?!.*Normal).*").Count

正则表达式将匹配“状态:”后跟任何空格后跟任何内容,只要它不是“正常”使用否定前瞻。值得注意的是,Regex更适合“匹配”事物,而不是“不匹配”事物。