Заполните многомерный массив простым текстом в Powershell

Я работаю над сценарием Powershell для мониторинга SAN. Я успешно извлек текстовый файл, содержащий все значения из системы в Powershell, с помощью этого кода:

& "NaviSecCli.exe" -user xxxx -password xxxx -h host -f "C:\LUNstate.txt" lun -list
$Path = "C:\LUNstate.txt"
$Text = "Capacity \(GBs\)"
$Name = "^Name"
Get-Content $Path | Select-String -pattern $Text,$Name

Это создает следующий вывод:

Name:  TEST-DATASTORE-1
User Capacity (GBs):  1536.000
Consumed Capacity (GBs):  955.112
Name:  CV Snapshot Mountpoint
User Capacity (GBs):  1024.000
Consumed Capacity (GBs):  955.112

Теперь я могу разделить значения через двоеточие, поместив вывод в переменную:

$LUNArray = Get-Content $Path | Select-String -pattern $Text,$Name
$LUNArray | foreach {
    $LUNArray = $_ -split ':  '
    Write-Host $LUNArray[0]
    Write-Host $LUNArray[1]
}

Единственные интересные данные хранятся в $LUNArray[1], поэтому я могу просто пропустить Write-Host $LUNArray[0], который дает мне следующий вывод:

TEST-DATASTORE-1
1536.000
955.112
CV Snapshot Mountpoint
1024.000
955.112

Теперь самое сложное, я хотел бы поместить данные в многомерный массив. Таким образом, я бы получил следующий макет массива:

LUN                     Usercap    ConsCap
TEST-DATASTORE-1        1536.000   955.112
CV Snapshot Mountpoint  1024.000   955.112

Входной файл выглядит так:

LOGICAL UNIT NUMBER 201
Name:  TEST-DATASTORE-1
UID:  60:06:E4:E3:11:50:E4:E3:11:20:A4:D0:C6:E4:E3:11
Current Owner:  SP B
Default Owner:  SP B
Allocation Owner:  SP B
User Capacity (Blocks):  3221225472
User Capacity (GBs):  1536.000
Consumed Capacity (Blocks):  2005641216
Consumed Capacity (GBs):  956.364
Pool Name:  Pool HB Hasselt
Raid Type:  Mixed
Offset:  0
Auto-Assign Enabled:  DISABLED
Auto-Trespass Enabled:  DISABLED
Current State:  Ready
Status:  OK(0x0)
Is Faulted:  false
Is Transitioning:  false
Current Operation:  None
Current Operation State:  N/A
Current Operation Status:  N/A
Current Operation Percent Completed:  0
Is Pool LUN:  Yes
Is Thin LUN:  Yes
Is Private:  No
Is Compressed:  No
Tiering Policy:  Lowest Available
Initial Tier:  Lowest Available
Tier Distribution:  
Capacity:  100.00%

LOGICAL UNIT NUMBER 63920
Name:  CV Snapshot Mountpoint
UID:  60:50:38:00:14:50:38:00:C6:64:50:38:00:50:38:00
Current Owner:  SP B
Default Owner:  SP B
Allocation Owner:  SP B
User Capacity (Blocks):  2147483648
User Capacity (GBs):  1024.000
Consumed Capacity (Blocks):  2005641216
Consumed Capacity (GBs):  956.364
Pool Name:  Pool HB Hasselt
Raid Type:  Mixed
Offset:  0
Auto-Assign Enabled:  DISABLED
Auto-Trespass Enabled:  DISABLED
Current State:  Ready
Status:  OK(0x0)
Is Faulted:  false
Is Transitioning:  false
Current Operation:  None
Current Operation State:  N/A
Current Operation Status:  N/A
Current Operation Percent Completed:  0
Is Pool LUN:  Yes
Is Thin LUN:  Yes
Is Private:  No
Is Compressed:  No
Tiering Policy:  Lowest Available
Initial Tier:  Lowest Available
Tier Distribution:  
Capacity:  100.00%

...

2 ответа

Создайте список пользовательских объектов, например так:

& "NaviSecCli.exe" -user xxxx -password xxxx -h host -f "C:\LUNstate.txt" lun -list

$datafile = 'C:\LUNstate.txt'
$pattern  = 'Name:\s+(.*)[\s\S]+(User Capacity).*?:\s+(.*)\s+(Consumed Capacity).*?:\s+(.*)'

$LUNArray = (Get-Content $datafile | Out-String) -split '\r\n(\r\n)+' |
  Select-String $pattern -AllMatches |
  Select-Object -Expand Matches |
  % {
    New-Object -Type PSObject -Property @{
      'LUN'              = $_.Groups[1].Value
      $_.Groups[2].Value = $_.Groups[3].Value
      $_.Groups[4].Value = $_.Groups[5].Value
    }
  }

Данные могут отображаться, например, так:

"{0}: {1}" -f $LUNArray[1].LUN, $LUNArray[1].'Consumed Capacity'
$filePath = 'absolute path'
$content = [IO.File]::ReadAllText($filePath)
[regex]::Matches(
    $content,
    '(?x)
        Name: [ ]* ([^\n]+)  #  name
        \n User [ ] (Capacity) [^:]+: [ ]* ([^\n]+) # capacity 
        \n Consumed [ ] \2  [^:]+:[ ]* ([^\n]+)' # Consumed
    ) | 
    ForEach-Object {

              $LUN = $_.groups[1].value
              $Usercap = $_.groups[3].value
              $ConsCap = $_.groups[4].value
          # process $Lun, $Usercap and $ConsCap

    }
Другие вопросы по тегам