我正在尝试使用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答案 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更适合“匹配”事物,而不是“不匹配”事物。