不确定"放气"是正确的术语,但我想知道是否有更好的方法来指定您只想在使用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
请记住,我不希望返回平面属性 - 我希望删除一些属性的原始对象/仅包含我指定的属性。
答案 0 :(得分:4)
您可以 Select-Object
执行此操作:
$result = $test | select testProp, @{
Name = 'id'
Expression = { $_.testChild.id }
}
基本上,Select-Object
允许您定义自己的属性,其中值由表达式([ScriptBlock]
)确定,因此您可以运行任何想要确定值的代码。在块中,$_
指的是"当前对象"与ForEach-Object
电话中的方式相同。