我有一个命令
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>
,这样我就可以避免一一删除应用程序的麻烦。
这是我运行命令后的示例输出
前言:
下面的解决方案使用文本解析将表格文本输出转换为对象。
这种方法最好避免,但并非总是如此,即如果源 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 $_ #> })
来迭代所有应用程序信息。