Powershell:子属性
不确定“deflating”是否是正确的术语,但我想知道是否有更好的方法来指定在使用Powershell:子属性,powershell,Powershell,不确定“deflating”是否是正确的术语,但我想知道是否有更好的方法来指定在使用Select object时只返回对象子对象属性的选择?我正在使用Powershell v5 这里是一个完全有效的示例-$test变量在这里是硬编码的,用于演示;在我的用例中,$test数组是从API返回的。我想在投影期间从testChild对象中删除name属性 我能找到的唯一方法是使用foreach循环,同时将管道输送到$result,然后重新创建每个子对象并仅设置所需的属性,但感觉powershell应该有
Select object
时只返回对象子对象属性的选择?我正在使用Powershell v5
这里是一个完全有效的示例-$test
变量在这里是硬编码的,用于演示;在我的用例中,$test
数组是从API返回的。我想在投影期间从testChild
对象中删除name
属性
我能找到的唯一方法是使用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
请记住,我不希望返回平面属性-我希望删除某些属性的原始对象/仅包含我指定的属性。您可以使用选择对象来执行此操作:
$result = $test | select testProp, @{
Name = 'id'
Expression = { $_.testChild.id }
}
基本上,Select Object
允许您定义自己的属性,其中值由表达式确定(a[ScriptBlock]
),因此您可以运行任何要确定值的代码。在块中,$\ucode>引用“当前对象”的方式与调用每个对象时的方式相同。谢谢。这仍然让人觉得相当冗长(实际上比我的用例中的示例生成了/更多/代码-主要是因为我正在为某些属性操作数组)。如果没有其他人提出更整洁的建议,我会接受的!实际上,您的答案与我指定的不符-您返回了一个平坦的id
属性。根据我的示例,它需要是一个对象。@Spikh您可以使表达式成为自己的Select object
语句,这将使它保持为一个对象,或者您可以使表达式像以前一样直接创建[PSObject]
。有几种方法,但没有任何方法可以直接给出您想要的确切结果