将输出转换为 CSV 和 Out-Grid

Converting Output to CSV and Out-Grid

我有一个文件如下。 我希望它能将其转换为 CSV 文件,并希望只显示项目驱动器、驱动器类型、总计 Space、当前分配和剩余 space 的外网格视图。

PS C:\> echo $fileSys
Storage system address: 127.0.0.1
Storage system port: 443
HTTPS connection

1:    Name               = Extreme Performance
      Drives             = 46 x 3.8T SAS Flash 4
      Drive type         = SAS Flash
      RAID level         = 5
      Stripe length      = 13
      Total space        = 149464056594432 (135.9T)
      Current allocation = 108824270733312 (98.9T)
      Remaining space    = 40639785861120 (36.9T)

我是 Powershell 的新手,但我已经尝试了以下两件事的代码,但它甚至没有得到我想要的输出。

$filesys | ForEach-Object {
    if ($_ -match '^.+?(?<Total space>[0-9A-F]{4}\.[0-9A-F]{4}\.[0-9A-F]{4}).+?(?<Current allocation>\d+)$') {
        [PsCustomObject]@{
            'Total space'  = $matches['Total space']
            'Current allocation' = $matches['Current allocation']
        }
    }
}

首先,命名的捕获组不能包含空格。

来自documentation

Named Matched Subexpressions

where name is a valid group name, and subexpression is any valid regular expression pattern. name must not contain any punctuation characters and cannot begin with a number.

假设这是一个单一的字符串,因为您的模式试图从多行中获取信息,您可以放弃循环。但是,即使更正了这一点,您的模式似乎也与数据不匹配。我不清楚您要匹配什么或您想要的输出。希望这会让您走上正轨。

$filesys = @'
Storage system address: 127.0.0.1
Storage system port: 443
HTTPS connection

1:    Name               = Extreme Performance
      Drives             = 46 x 3.8T SAS Flash 4
      Drive type         = SAS Flash
      RAID level         = 5
      Stripe length      = 13
      Total space        = 149464056594432 (135.9T)
      Current allocation = 108824270733312 (98.9T)
      Remaining space    = 40639785861120 (36.9T)
'@

if($filesys -match '(?s).+total space\s+=\s(?<totalspace>.+?)(?=\r?\n).+allocation\s+=\s(?<currentallocation>.+?)(?=\r?\n)')
{
    [PsCustomObject]@{
        'Total space'  = $matches['totalspace']
        'Current allocation' = $matches['currentallocation']
    }
}

Total space              Current allocation     
-----------              ------------------     
149464056594432 (135.9T) 108824270733312 (98.9T)

编辑

如果你只想要括号内的值,修改成这样即可。

if($filesys -match '(?s).+total space.+\((?<totalspace>.+?)(?=\)).+allocation.+\((?<currentallocation>.+?)(?=\))')
{
    [PsCustomObject]@{
        'Total space'  = $matches['totalspace']
        'Current allocation' = $matches['currentallocation']
    }
}

Total space Current allocation
----------- ------------------
135.9T      36.9T  
$unity=[Regex]::Matches($filesys, "\(([^)]*)\)") -replace '[(\)]',''  -replace "T",""

$UnityCapacity = [pscustomobject][ordered] @{

Name = "$Display"

"Total" =$unity[0]

"Used" = $unity[1]

"Free" = $unity[2]

'Used %' = [math]::Round(($unity[1] / $unity[0])*100,2)
}``