Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell:子属性_Powershell - Fatal编程技术网

Powershell:子属性

Powershell:子属性,powershell,Powershell,不确定“deflating”是否是正确的术语,但我想知道是否有更好的方法来指定在使用Select object时只返回对象子对象属性的选择?我正在使用Powershell v5 这里是一个完全有效的示例-$test变量在这里是硬编码的,用于演示;在我的用例中,$test数组是从API返回的。我想在投影期间从testChild对象中删除name属性 我能找到的唯一方法是使用foreach循环,同时将管道输送到$result,然后重新创建每个子对象并仅设置所需的属性,但感觉powershell应该有

不确定“deflating”是否是正确的术语,但我想知道是否有更好的方法来指定在使用
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]
。有几种方法,但没有任何方法可以直接给出您想要的确切结果