如何在自定义命令中打印名称值[关闭]

问题描述 投票:0回答:1

我有一个命令

cf apps
输出:

name                                               requested state   processes   routes

accountdivisioncalculator__pte01__performance__0   started           web:2/2     accountdivisioncalculator-pte01.dev.schwab.tech, accountdivisioncalculator-pte01-e2e-ad00007734.scp2-test-app-bdv.dev.schwab.com
accountdivisioncalculator__qae01__e2e__0           started           web:1/1

如何访问名称的所有值,然后循环每个应用程序名称?

这个想法是获取所有应用程序名称的列表并运行

cf delete <app_name>
,这样我就可以避免一一删除应用程序的麻烦。

这是我运行命令后的示例输出

enter image description here

powershell command-line command-prompt cloud-foundry
1个回答
1
投票

前言:

  • 下面的解决方案使用文本解析将表格文本输出转换为对象

  • 这种方法最好避免,但并非总是如此,即如果源 CLI 缺乏对输出结构化文本格式(例如 JSON 或 CSV)的支持;事实上,在撰写本文时,CloudFoundry

    cf
    似乎就是这种情况。


使用以下内容,做出以下假设,与您的样本数据一致:

  • 列标题和数据行字段必须用 两个或更多空格分隔。
# Initialize helper variables.
$propNames = $null
$ohtTemplate = [ordered] @{}

# Parse the tabular CLI output into objects.
$appInfos = 
  cf apps | 
    Where-Object { $_ } | # remove empty lines
    ForEach-Object {
      $fields = ($_ -split ' {2,}').Trim()
      if ($null -eq $propNames) { 
        $propNames = $fields
        foreach ($propName in $propNames) {
          $ohtTemplate[$propName] = $null
        }
        return 
      }
      foreach ($i in 0..($propNames.Count-1)) {
        if ($i -lt $fields.Count) {
          $ohtTemplate[$propNames[$i]] = $fields[$i]
        }
        else {
          $ohtTemplate[$propNames[$i]] = $null
        }
      }
      [pscustomobject] $ohtTemplate
    }

# Output the resulting objects, for visual inspection.
$appInfos

上面发出自定义对象,其属性名称对应于表头,其值包含行的列值(全部存储为字符串)。

PowerShell 的用于显示输出格式化系统可以方便地呈现结果对象,如下所示:

name                                             requested state processes routes
----                                             --------------- --------- ------
accountdivisioncalculator__pte01__performance__0 started         web:2/2   accountdivisioncalculator-pte01.dev.schwab.tech, accountdivisioncalculator-pte01-e2e-ad00007734.scp2-tes…
accountdivisioncalculator__qae01__e2e__0         started         web:1/1   

要仅获取名称(例如,作为数组),使用 member-access enumeration,请使用

$appInfos.name
:

# Output from `$appInfos.name`
accountdivisioncalculator__pte01__performance__0
accountdivisioncalculator__qae01__e2e__0

要仅获取 first 应用程序的名称,请使用

$appInfos[0].name

当然,您可以像往常一样使用

$appInfos | ForEach-Object { <# work with $_ #> }
foreach ($app in $appInfos) { <# work with $app #> }
$appInfos.ForEach({ <# work with $_ #> })
来迭代所有应用程序信息。

© www.soinside.com 2019 - 2024. All rights reserved.