我正在使用PowerShell并运行一个工具来提取Lenovo硬件RAID控制器信息,以标识控制器编号,以便以后在另一个命令行中使用(这是SCCM服务器构建任务序列的一部分)。该工具输出大量数据,我正尝试从输出中隔离出我需要的东西。
我已经能够隔离出我所需要的东西,但是我认为必须有一种更有效的方法来寻找优化。在处理字符串方面,我仍在学习。
我正在寻找的工具的行输出如下所示:
0 0 0 252:0 17 DRIVE Onln N 557.861 GB dsbl N N dflt -
我正在尝试将0的左边的3个字符(即252,但是在其他型号上可能是65或其他2或3位数字)
我现有的代码是:
$ControllerInfo = cmd /c '<path>\storcli64.exe /c0 show'
$forEach ($line in $ControllerInfo) {
if ($line -like '*:0 *') {
$ControllerNum = $line.split(':')[0] # Get everything left of :
$ControllerNum = $ControllerNum.Substring($ControllerNum.Length -3) # Get last 3 chars of string
$ControllerNum = $ControllerNum.Replace(' ', '') # Remove blanks
Write-Host $ControllerNum
break #stop looping through output
}
}
上面的方法有效,但是我想知道是否有一种方法可以将以$ ControllerNum =开头的三行结合起来,这样我就可以只用一条$ ControllerNum =(命令)行来设置变量而不是在其中执行3行。基本上想将Split,Substring和Replace命令组合成一行。
谢谢!
答案 0 :(得分:0)
如果只需要第一个:
前的最后一位数字,且没有任何空格,则可以使用一个或两个正则表达式来实现:
$line -replace '^.*\b(\d+):.*$','$1'
正则表达式说明:
^ # start of string
.* # any number of any characters
\b # word boundary
( # start capture group
\d+ # 1 or more strings
) # end capture group
: # a literal colon (:)
.* # any number of any characters
$ # end of string
替换:
$1 # Value captured in the capture group above
答案 1 :(得分:0)
这是另一种选择:
$ControllerNum = ([regex]'(\d{2,3}):0').Match($line).Groups[1].Value
用于样本0 0 0 252:0 17 DRIVE Onln N 557.861 GB dsbl N N dflt -
$ ControllerNum中的结果将为252