PowerShell:如何在循环中更改表头?

时间:2015-11-27 08:41:45

标签: powershell

我希望远程收集数据,然后在xml文件的帮助下调整表头。这应该在一个循环中发生,看起来像这样:

foreach($tableheader in $table) {
  $table.$tableheader = $xmlFile.$tableheader
}

除此之外,我尝试了以下方法:

$x = 0
$sitesonfig = Get-ConfigSite -AdminAddress localhost  
foreach($Prop in ($siteconfig |get-member -MemberType Property | select -Property name))
{
 $x += 1; 
 $siteconfig = $siteconfig | Select-Object  * | format-table @{l="Smile$x";e={$_.$Prop}}
}

是的,我知道这看起来很傻,但我真的不知道,如何逐个更改标题,而不是每次都列出所有其他标题。

1 个答案:

答案 0 :(得分:0)

一种可能性是使用循环来创建传递给Format-Table的标题映射。

这是您修改的第二个示例,用于演示此概念。您应该能够对此进行调整以从XML文件中获取标头信息。

$x = 0
$siteconfig = Get-ConfigSite -AdminAddress localhost  

$headerMap = @()
foreach($Prop in ($siteconfig |get-member -MemberType Property | select -ExpandProperty name))
{
 $x += 1; 
 $headerMap += @{
        l="Smile$x";
        e={ $_.$Prop }.GetNewClosure()
    }
}
$siteconfig | Format-Table $headerMap

要点

  1. Select -Property name需要更改为Select -ExpandProperty name。原因是PowerShell中的Select-Object将返回一个过滤到所选成员的对象,但是您需要一个字符串来按名称获取属性值。 -ExpandProperty参数会将其扩展为字符串值。
  2. 表达式块需要GetNewClosure()调用它来捕获创建脚本块时的$Prop值与调用时的值$Prop。如果您对闭包和PowerShell的范围规则的概念不熟悉,这可能会有点混乱。如果没有这个,由于PowerShell的范围规则,$Prop将在Format-Table使用它时评估GetNewClosure()的值。通过调用$Prop,在调用GetNewClosure()时会捕获struct message的值,这就是我们在这种情况下所需的内容。