Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Select-Object -ExpandProperty hides ETS instance members #7937

Copy link
Copy link
@mklement0

Description

@mklement0
Issue body actions

Follow-up from #7768

If you use -ExpandProperty with a property whose value happens to be an object with instance ETS members (ETS members added with -Add-Member), these members are no longer present in the value returned.

Note: The behavior only surfaces if the object is not an instance of [psobject] - that is, if it is neither a true custom object ("property bag") nor an incidental [psobject] wrapper (see #5579).

@PetSerAl discovered this problem in the context of #7768 and explains it as follows:

In v2 extra properties were linked to PSObject wrapper. So two PSObjects wrapping the same underlying object can have different set of extra properties. In v3 properties now linked to underlying object (with some exceptions), but not to PSObject wrapper. But in the process PowerShell devs decided to keep/grant Select-Object -ExpandProperty ability to create independent PSObject wrappers, which links properties to themselves rather than to underlying objects.
[...]
Although, I do not think Select-Object should really do this. I do not see reasons why it use/have this ability in the first place (compatibility? maybe).

A fix for this issue - to no longer attach the ETS members to the incidental wrapper and instead use the resurrection tables - should also fix the problem described in #12411.

Steps to reproduce

$v = [datetime]::now; $v | Add-Member myProp myPropValue
"[$($v.myProp)]"
'---'
# This should retrieve the original $v value, via Select-Object -ExpandProperty
 $vToo = [pscustomobject] @{ prop = $v } | Select-Object -ExpandProperty prop
"[$($vToo.myProp)]"

Expected behavior

[myPropValue]
---
[myPropValue]

That is, the .myProp instance member should still be present.

Actual behavior

[myPropValue]
---
[]

That is, the .myProp instance member is no longer present.

What presumably happens is that a [psobject] wrapper is created around the output object with storeTypeNameAndInstanceMembersLocally set to $true, which makes PowerShell look for instance members only on the wrapper object itself, effectively eclipsing any preexisting instance members associated with the wrapped object via the resurrection tables.

Environment data

PowerShell Core v6.1.0
Reactions are currently unavailable

Metadata

Metadata

Assignees

No one assigned

    Labels

    Issue-BugIssue has been identified as a bug in the productIssue has been identified as a bug in the productIssue-Discussionthe issue may not have a clear classification yet. The issue may generate an RFC or may be reclassifthe issue may not have a clear classification yet. The issue may generate an RFC or may be reclassifResolution-No ActivityIssue has had no activity for 6 months or moreIssue has had no activity for 6 months or moreWG-Cmdlets-Utilitycmdlets in the Microsoft.PowerShell.Utility modulecmdlets in the Microsoft.PowerShell.Utility module

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      Morty Proxy This is a proxified and sanitized view of the page, visit original site.