首页 > 解决方案 > 将带空单元格的格式化字符串输出转换为 PS 对象

问题描述

我有一个命令的字符串输出,我试图将其转换为面向对象的 PSObject。输出如下所示:

NAME                         STATUS    VOLUME                      CAPACITY   ACCESS MODES   STORAGECLASS       AGE    VOLUMEMODE
app1-iscsi-pvc0              Bound     app1-iscsi-pv0              100Gi      RWO                               236d   Filesystem
app1-iscsi-pvc1              Bound     app1-iscsi-pv1              5Gi        RWO                               236d   Filesystem
app1-iscsi-pvc2              Bound     app1-iscsi-pv2              5Gi        RWO                               236d   Filesystem
mssql-iscsi-pvc              Bound     mssql-iscsi-pv0             100Gi      RWO            manual             310d   Filesystem
my-claim                     Bound     my-local-pv                 2Gi        RWO            my-local-storage   242d   Filesystem
app1.2-pvc-app1.2-0          Bound     app1.2-pv0                  50Gi       RWO            manual             309d   Filesystem
app1.2-pvc-app1.2-1          Bound     app1.2-pv1                  50Gi       RWO            manual             309d   Filesystem
app1.2-pvc-app1.2-2          Bound     app1.2-pv2                  50Gi       RWO            manual             309d   Filesystem
app1.1-pvc-app1.1-0          Bound     app1.1-pv0                  100Gi      RWO            manual             308d   Filesystem
app3-iscsi-xx-pvc0           Bound     app3-iscsi-xx-pv0           5Gi        RWO            manual             77d    Filesystem
app3-iscsi-xxxx-pvc0         Bound     app3-iscsi-xxxx-pv0         5Gi        RWO            manual             91d    Filesystem
app3-iscsi-xxxx-pvc0         Bound     app3-iscsi-xxxx-pv0         5Gi        RWO            manual             109d   Filesystem
app3-iscsi-xxxx-pvc0         Bound     app3-iscsi-xxxx-pv0         5Gi        RWO            manual             91d    Filesystem
app3-iscsi-xxx-pvc0          Bound     app3-iscsi-xxx-pv0          5Gi        RWO            manual             97d    Filesystem
app3-iscsi-xxxxx-pvc0        Bound     app3-iscsi-xxxxx-pv0        5Gi        RWO            manual             91d    Filesystem
app3-iscsi-pvc0              Bound     app3-iscsi-pv0              50Gi       RWO                               186d   Filesystem
app3-iscsi2-pvc0             Bound     app3-iscsi2-pv0             5Gi        RWO            manual             110d   Filesystem

...我遇到的问题是存储类列中的空“单元格”。由于单元格为空,所有其他输出格式都与我正在使用的当前方法正确,但此输出除外。使用我现有的方法,其中有空单元格,以下数据最终出现在前一列中,因为我的拆分正在折叠空白空间。

这是我目前使用的代码:

$p = Invoke-Expression 'kubectl get pvc -o wide'
$o = @()

## Determine header column.  The '\s{2,}' is to match everything with > 2 spaces in succession
$h = ($p[0] -replace '\s{2,}', '|||||') -split '|||||',0,"simplematch"
for ($i = 1; $i -lt $p.Count; $i++) {
    $e = ($p[$i] -replace '\s{2,}', '|||||') -split '|||||',0,"simplematch"
    
    $t = New-Object pscustomobject

    ## Add each member from the two different arrays into the psobject
    for ($x=0; $x -lt $h.Count; $x++) {
        $t | Add-Member -MemberType NoteProperty -Name $h[$x].Replace(' ', '_') -Value $e[$x]
    }
    
    $o += $t  
}

$o | ft

...是否有人知道解决将可变间距输出(有时是空单元格)可靠地转换为 psobject 的策略?蒂亚!

标签: powershellsplit

解决方案


使用此ConvertFrom-SourceTablecmdlet:

$Table = '
NAME                         STATUS    VOLUME                      CAPACITY   ACCESS MODES   STORAGECLASS       AGE    VOLUMEMODE
app1-iscsi-pvc0              Bound     app1-iscsi-pv0              100Gi      RWO                               236d   Filesystem
app1-iscsi-pvc1              Bound     app1-iscsi-pv1              5Gi        RWO                               236d   Filesystem
app1-iscsi-pvc2              Bound     app1-iscsi-pv2              5Gi        RWO                               236d   Filesystem
mssql-iscsi-pvc              Bound     mssql-iscsi-pv0             100Gi      RWO            manual             310d   Filesystem
my-claim                     Bound     my-local-pv                 2Gi        RWO            my-local-storage   242d   Filesystem
app1.2-pvc-app1.2-0          Bound     app1.2-pv0                  50Gi       RWO            manual             309d   Filesystem
app1.2-pvc-app1.2-1          Bound     app1.2-pv1                  50Gi       RWO            manual             309d   Filesystem
app1.2-pvc-app1.2-2          Bound     app1.2-pv2                  50Gi       RWO            manual             309d   Filesystem
app1.1-pvc-app1.1-0          Bound     app1.1-pv0                  100Gi      RWO            manual             308d   Filesystem
app3-iscsi-xx-pvc0           Bound     app3-iscsi-xx-pv0           5Gi        RWO            manual             77d    Filesystem
app3-iscsi-xxxx-pvc0         Bound     app3-iscsi-xxxx-pv0         5Gi        RWO            manual             91d    Filesystem
app3-iscsi-xxxx-pvc0         Bound     app3-iscsi-xxxx-pv0         5Gi        RWO            manual             109d   Filesystem
app3-iscsi-xxxx-pvc0         Bound     app3-iscsi-xxxx-pv0         5Gi        RWO            manual             91d    Filesystem
app3-iscsi-xxx-pvc0          Bound     app3-iscsi-xxx-pv0          5Gi        RWO            manual             97d    Filesystem
app3-iscsi-xxxxx-pvc0        Bound     app3-iscsi-xxxxx-pv0        5Gi        RWO            manual             91d    Filesystem
app3-iscsi-pvc0              Bound     app3-iscsi-pv0              50Gi       RWO                               186d   Filesystem
app3-iscsi2-pvc0             Bound     app3-iscsi2-pv0             5Gi        RWO            manual             110d   Filesystem'

Load-Script ConvertFrom-SourceTable # If needed, accept the repository warning
$Data = ConvertFrom-SourceTable $Table
$Data |Format-Table

NAME                  STATUS VOLUME               CAPACITY ACCESS MODES STORAGECLASS     AGE  VOLUMEMODE
----                  ------ ------               -------- ------------ ------------     ---  ----------
app1-iscsi-pvc0       Bound  app1-iscsi-pv0       100Gi    RWO                           236d Filesystem
app1-iscsi-pvc1       Bound  app1-iscsi-pv1       5Gi      RWO                           236d Filesystem
app1-iscsi-pvc2       Bound  app1-iscsi-pv2       5Gi      RWO                           236d Filesystem
mssql-iscsi-pvc       Bound  mssql-iscsi-pv0      100Gi    RWO          manual           310d Filesystem
my-claim              Bound  my-local-pv          2Gi      RWO          my-local-storage 242d Filesystem
app1.2-pvc-app1.2-0   Bound  app1.2-pv0           50Gi     RWO          manual           309d Filesystem
app1.2-pvc-app1.2-1   Bound  app1.2-pv1           50Gi     RWO          manual           309d Filesystem
app1.2-pvc-app1.2-2   Bound  app1.2-pv2           50Gi     RWO          manual           309d Filesystem
app1.1-pvc-app1.1-0   Bound  app1.1-pv0           100Gi    RWO          manual           308d Filesystem
app3-iscsi-xx-pvc0    Bound  app3-iscsi-xx-pv0    5Gi      RWO          manual           77d  Filesystem
app3-iscsi-xxxx-pvc0  Bound  app3-iscsi-xxxx-pv0  5Gi      RWO          manual           91d  Filesystem
app3-iscsi-xxxx-pvc0  Bound  app3-iscsi-xxxx-pv0  5Gi      RWO          manual           109d Filesystem
app3-iscsi-xxxx-pvc0  Bound  app3-iscsi-xxxx-pv0  5Gi      RWO          manual           91d  Filesystem
app3-iscsi-xxx-pvc0   Bound  app3-iscsi-xxx-pv0   5Gi      RWO          manual           97d  Filesystem
app3-iscsi-xxxxx-pvc0 Bound  app3-iscsi-xxxxx-pv0 5Gi      RWO          manual           91d  Filesystem
app3-iscsi-pvc0       Bound  app3-iscsi-pv0       50Gi     RWO                           186d Filesystem
app3-iscsi2-pvc0      Bound  app3-iscsi2-pv0      5Gi      RWO          manual           110d Filesystem

推荐阅读