首页 > 解决方案 > 从 Select-Object 启动一个数组

问题描述

我正在尝试生成一个输出字符串,例如Item1, Item2,用逗号分隔符连接。我们通过在Select-Object -Property.

检查此代码:

$Test =  @(
    [PSCustomObject]@{
        Name = 'Test'
    }
    [PSCustomObject]@{
        Name = 'Test2'
    }
) | Select-Object -Property @{N = 'Problem'; E = { @() } },
@{N = 'EmployeeType'; E = { $null } }, *

foreach ($R in $Test) {
    $R.Problem += 'Item1'
    $R.Problem += 'Item2'
}


$Test | Select-Object -Property @{Name = 'Problem'; Expression = { $_.Problem -join "; " } }, * -ExcludeProperty Problem | fl

结果:

Problem      : Item1Item2
Name         : Test

Problem      : Item1Item2
Name         : Test2

为什么属性Problem连接为 aString而不是 a Array?如何将其转换为Array?

标签: arrayspowershell

解决方案


在计算属性的表达式中实例化一个空数组@()是不够的,因为 PowerShell 会将其展平并且它将变为 $null。

,@()改为使用

$Test =  @(
    [PSCustomObject]@{
        Name = 'Test'
    }
    [PSCustomObject]@{
        Name = 'Test2'
    }
) | Select-Object -Property @{N = 'Problem'; E = { ,@() } },
                            @{N = 'EmployeeType'; E = { $null } }, *

foreach ($R in $Test) {
    $R.Problem += 'Item1'
    $R.Problem += 'Item2'
}

$Test | Select-Object -Property @{Name = 'Problem'; Expression = { $_.Problem -join "; " } }, * -ExcludeProperty Problem | fl

回报:

Problem      : Item1; Item2
EmployeeType : 
Name         : Test

Problem      : Item1; Item2
EmployeeType : 
Name         : Test2

推荐阅读