Powershell:儿童财产通缩

时间:2016-08-03 15:15:36

标签: powershell

不确定"放气"是正确的术语,但我想知道是否有更好的方法来指定您只想在使用Select-Object时返回对象的子项属性的选择?我使用的是Powershell v5。

这是一个完整的示例 - $test变量在此处进行了硬编码以用于演示目的;在我的用例中,从API返回$test数组。我想在投影期间从name对象中删除testChild属性。

我能弄清楚如何做到这一点的唯一方法是使用foreach循环同时管道进入$result,然后重新创建每个子对象并仅设置所需的属性,但感觉PowerShell应该具有更好的方法。

$test = @(
    [PSCustomObject]@{
        testProp = "test1"
        testChild = [PSCustomObject]@{
            id = 1
            name = "test name 1"
        }
    },
    [PSCustomObject]@{
        testProp = "test2"
        testChild = [PSCustomObject]@{
            id = 2
            name = "test name 2"
        }
    }
)

$result = $test | select testProp, testChild | % {
    $_.testChild = [PSCustomObject]@{
        id = $_.testChild.id
    }
    $_
}

$result

输出:

testProp testChild
-------- ---------
test1    @{id=1}  
test2    @{id=2}  

这正是我想要的。如果我可以这样做,我会很高兴:

$result = $test | select testProp, testChild.id

请记住,我不希望返回平面属性 - 我希望删除一些属性的原始对象/仅包含我指定的属性。

1 个答案:

答案 0 :(得分:4)

您可以 Select-Object执行此操作

$result = $test | select testProp, @{
    Name = 'id'
    Expression = { $_.testChild.id }
}

基本上,Select-Object允许您定义自己的属性,其中值由表达式([ScriptBlock])确定,因此您可以运行任何想要确定值的代码。在块中,$_指的是"当前对象"与ForEach-Object电话中的方式相同。