首页 > 解决方案 > 如何使用拆分和子字符串以及 foreach 处理数组

问题描述

如何使用拆分处理数组substringforeach输出以下信息。

我尝试过拆分和substring. 但还是不行。谢谢。

$item=$item.ToString() 
$driveID=$item.Substring(0,26) 
$ID=($driveID.Split(":")[-1]).trim()
$status=$item.Substring(27,$item.Length-1-27)
$stauts1=($status.split(",")[-1]).trim()

输入【数组】:

physicaldrive 1I:1:9 (port 1I:box 1:bay 9, SAS HDD, 900 GB, OK)
physicaldrive 1I:1:10 (port 1I:box 1:bay 10, SAS HDD, 900 GB, OK)
physicaldrive 1I:1:11 (port 1I:box 1:bay 11, SAS HDD, 2.4 TB, OK, spare)
physicaldrive 1I:1:12 (port 1I:box 1:bay 12, SAS HDD, 900 GB, OK, shared spare)

预期输出:

DriveID DriveStatus
9  OK
10 OK
11 OK
12 OK

标签: powershell

解决方案


以下假定DriveID为单词后的数字bay。代码抓取命名的捕获组并使用它们来制作 PSCustomObject。然后发送到$DriveInfo集合,最后显示在屏幕上。那时您可以轻松地将其导出。[咧嘴笑]

#region >>> fake reading in a text file
#    in real life, use Get-Content
$InStuff = @'
physicaldrive 1I:1:9 (port 1I:box 1:bay 9, SAS HDD, 900 GB, OK)
physicaldrive 1I:1:10 (port 1I:box 1:bay 10, SAS HDD, 900 GB, OK)
physicaldrive 1I:1:11 (port 1I:box 1:bay 11, SAS HDD, 2.4 TB, OK, spare)
physicaldrive 1I:1:12 (port 1I:box 1:bay 12, SAS HDD, 900 GB, OK, shared spare)
'@ -split [System.Environment]::NewLine
#endregion >>> fake reading in a text file


$DriveInfo = $InStuff.ForEach({
    $Null = $_ -match '^.+:bay (?<DriveID>\d+), .+b, (?<Status>.+).+$'
    [PSCustomObject]@{
        DriveID = $Matches.DriveID
        Status = $Matches.Status.Split(',')[0]
        }
    })

$DriveInfo

输出 ...

DriveID Status
------- ------
9       OK    
10      OK    
11      OK    
12      OK    

推荐阅读