将多个字符串命令组合成一行

时间:2019-07-16 12:51:50

标签: powershell powershell-4.0

我正在使用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命令组合成一行。

谢谢!

2 个答案:

答案 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