【问题标题】:PsObject array in powershellPowershell中的PsObject数组
【发布时间】:2016-10-08 21:03:37
【问题描述】:

这是我的代码:

$a = @()

for ($i = 0; $i -lt 5; $i++)
{

$item = New-Object PSObject
$item | Add-Member -type NoteProperty -Name 'Col1' -Value 'data1'
$item | Add-Member -type NoteProperty -Name 'Col2' -Value 'data2'
$item | Add-Member -type NoteProperty -Name 'Col3' -Value 'data3'
$item | Add-Member -type NoteProperty -Name 'Col4' -Value 'data4'

$a += $item
}

使用这段代码,我可以得到这样的结果:

Col1 Col2 Col3 Col4
---- ---- ---- ----
   0    1    2    3
   1    2    3    4
   2    3    4    5
   3    4    5    6
   4    5    6    7

嗯,很好,但是如何更简单,更恰当地实现呢?有没有办法创建数组PsObject 也许?

我正在使用Powershell v4

【问题讨论】:

    标签: powershell powershell-4.0


    【解决方案1】:

    你所做的并没有错,但你可以利用一些东西。

    Add-Member 上的 -PassThru 参数将返回对象本身,因此您可以将它们链接起来:

    $a = @()
    
    for ($i = 0; $i -lt 5; $i++)
    {
        $item = New-Object PSObject |
        Add-Member -type NoteProperty -Name 'Col1' -Value 'data1' -PassThru |
        Add-Member -type NoteProperty -Name 'Col2' -Value 'data2' -PassThru |
        Add-Member -type NoteProperty -Name 'Col3' -Value 'data3' -PassThru |
        Add-Member -type NoteProperty -Name 'Col4' -Value 'data4' -PassThru
    
        $a += $item
    }
    

    您可以提供[hashtable] 的属性以进行初始添加:

    $a = @()
    
    for ($i = 0; $i -lt 5; $i++)
    {
        $item = New-Object PSObject -Property @{
            Col1 = 'data1'
            Col2 = 'data2'
            Col3 = 'data3'
            Col4 = 'data4'
        }
    
        $a += $item
    }
    

    同样,您可以使用[PSCustomObject] 类型的加速器:

    $a = @()
    
    for ($i = 0; $i -lt 5; $i++)
    {
        $item = [PSCustomObject]@{
            Col1 = 'data1'
            Col2 = 'data2'
            Col3 = 'data3'
            Col4 = 'data4'
        }
    
        $a += $item
    }
    

    【讨论】:

      【解决方案2】:

      我喜欢将PSCustomObject 转换为hashtable

      $a = for ($i = 0; $i -lt 5; $i++){
          [PSCustomObject] @{
              Col1 = 'data1'
              Col2 = 'data2'
              Col3 = 'data3'
              Col4 = 'data4'    
              }
      }
      

      您可以将for 循环分配给$a


      或单行:

      $a = 1 .. 5 | % { [PSCustomObject] @{Col1 = 'data1'; Col2 = 'data2';Col3 = 'data3';Col4 = 'data4';}}
      

      【讨论】:

      • arg,好吧,我添加了一个单行解决方案。
      • 不错!我也喜欢循环分配。
      • +1 表示明智的单行。很多人似乎都对它们发疯了,但这是我书中可读性高的一个很好的例子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-31
      • 1970-01-01
      • 1970-01-01
      • 2022-01-06
      • 2016-02-03
      • 1970-01-01
      • 2017-05-08
      相关资源
      最近更新 更多