【问题标题】:Splatting the -property parameter in Select-Object or Format-Table在 Select-Object 或 Format-Table 中显示 -property 参数
【发布时间】:2018-10-19 06:49:28
【问题描述】:

有什么办法可以将Select-ObjectFormat-Table的-property参数打掉。

以下面的例子为例,我希望创建一个自定义表达式的哈希表,而不是 @{N="Address"; E={$ping[0].Address}},但我没有成功。

是否有其他方法可以实现此(或类似)?

期望的结果

$param = @{
    'Property' = @{
        'Address' = $ping[0].Address
        'IPV4 Address' = $ping[0].IPV4Address.IPAddressToString
        'IPV6 Address' = $ping[0].IPV6Address.IPAddressToString
        'Count' = $_.Count
        'Average' = [Math]::Round($_.Average)
        'Maximum' = $_.Maximum
        'Minimum' = $_.Minimum
    }

}

$ping | Measure-Object -Property ResponseTime -Average -Minimum -Maximum | Select-Object @param
$ping | Measure-Object -Property ResponseTime -Average -Minimum -Maximum | Format-Table @param

错误

Select-Object : The IPV6 Address key is not valid.
At line:15 char:76
+ ... operty ResponseTime -Average -Minimum -Maximum | Select-Object @param
+                                                      ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Select-Object], NotSupport 
   edException
    + FullyQualifiedErrorId : DictionaryKeyIllegal,Microsoft.PowerShell.Comman 
   ds.SelectObjectCommand

Format-Table : The IPV6 Address key is not valid.
At line:16 char:76
+ ... roperty ResponseTime -Average -Minimum -Maximum | Format-Table @param
+                                                       ~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Format-Table], NotSupporte 
   dException
    + FullyQualifiedErrorId : DictionaryKeyIllegal,Microsoft.PowerShell.Comman 
   ds.FormatTableCommand

   ds.SelectObjectCommand

以下是我通常如何创建自定义属性,但是对于较大的对象,它变得笨拙且更难以管理。

$ping | Measure-Object -Property ResponseTime -Average -Minimum -Maximum | Format-Table -Property `
    @{N="Address";E={$ping[0].Address}},
    @{N="IPV4 Address";E={$ping[0].IPV4Address.IPAddressToString}},
    @{N="IPV6 Address";E={$ping[0].IPV6Address.IPAddressToString}},
    @{N="Count";E={$_.Count}},
    @{N="Average";E={[Math]::Round($_.Average)}},
    @{N="Maximum";E={$_.Maximum}},
    @{N="Minimum";E={$_.Minimum}}

期望的输出

Address      IPV4 Address  IPV6 Address             Count Average Maximum Minimum
-------      ------------  ------------             ----- ------- ------- -------
Google.co.uk 216.58.206.67 2a00:1450:4009:814::2003    10      12      13      12

【问题讨论】:

    标签: powershell


    【解决方案1】:

    计算属性的语法是

    @{
        Name = 'Foo'
        Expression = { ... }
    }
    

    @{
        Label = 'Foo'
        Expression = { ... }
    }
    

    它定义了一个此类属性的名称/标签,以及它的计算方式。脚本块(一个匿名函数)延迟表达式的执行,因此在哈希表与Format-Table(或Select-Object等)一起使用之前不会计算属性值。

    参数-Property 的参数是这些哈希表的数组。即使您正在使用参数,您仍然需要定义该哈希表列表。

    您的代码将参数名称映射到单个哈希表,其中包含您要用于计算属性的名称和表达式。不过,这是无效的语法。即使语法有效,您仍然无法获得所需的结果,因为值的计算不会延迟(因为它们没有在脚本块中定义)。

    要获得您想要的结果,您需要像这样定义$param

    $param = @{
        Property = @{N="Address";E={$ping[0].Address}},
                   @{N="IPV4 Address";E={$ping[0].IPV4Address.IPAddressToString}},
                   @{N="IPV6 Address";E={$ping[0].IPV6Address.IPAddressToString}},
                   @{N="Count";E={$_.Count}},
                   @{N="Average";E={[Math]::Round($_.Average)}},
                   @{N="Maximum";E={$_.Maximum}},
                   @{N="Minimum";E={$_.Minimum}}
    }
    

    但是,除非您想多次使用相同的参数定义,否则我看不到上面直接在 Format-TableSelect-Object 语句中定义计算属性的优势。

    【讨论】:

    • @KarthickGanesan “这不起作用”不是有效的问题描述。请发布一个新问题。包括您当前拥有的代码(准确地说是minimal reproducible example),以及代码给您的所有错误。
    猜你喜欢
    • 1970-01-01
    • 2022-06-17
    • 2015-06-18
    • 2020-08-29
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2020-03-29
    相关资源
    最近更新 更多