Acerca de los miembros intrínsecos
Descripción breve
Proporciona información sobre los miembros intrínsecos de PowerShell que están disponibles para todos los objetos de PowerShell.
Descripción detallada
Cuando se crean objetos, PowerShell agrega algunas propiedades y métodos "ocultos" a cada objeto. Estas propiedades y métodos se conocen como miembros intrínsecos. Estos miembros intrínsecos normalmente están ocultos de la vista. Estos miembros ocultos se pueden ver mediante el parámetro Force de Get-Member.
Vistas de objeto
Los miembros intrínsecos incluyen un conjunto de propiedades MemberSet que representan una vista del objeto. Para obtener más información sobre las propiedades MemberSet, consulte PSMemberSet.
Cada objeto de PowerShell incluye las siguientes propiedades.
psbase
El
psbase
MemberSet contiene los miembros del objeto base sin extensión ni adaptación. En función del tipo de objeto, es una instancia de .NET envuelta por una instancia de[psobject]
o, si no hay ningún contenedor, es el objeto de entrada en sí mismo.psadapted
El
psadapted
MemberSet muestra el objeto base más los miembros adaptados, si están presentes. El sistema de tipos extendidos (ETS) agrega miembros adaptados.psextended
El
psextended
MemberSetsolo muestra los miembros agregados por los archivos Types.ps1xml y el cmdlet Add-Member. Cualquier objeto se puede extender en tiempo de ejecución mediante el cmdletAdd-Member
.psobject
El
psobject
MemberSet es una rica fuente de reflexión para cualquier objeto que incluya métodos, propiedades y otra información sobre el objeto.
Ejemplos
En este ejemplo, $hash
es una tabla hash que contiene información sobre un usuario.
El parámetro Force de Get-Member
nos muestra los miembros intrínsecos del objeto.
$hash = @{
Age = 33
Name = 'Bob'
}
$hash | Get-Member -Force -MemberType MemberSet, CodeProperty
TypeName: System.Collections.Hashtable
Name MemberType Definition
---- ---------- ----------
pstypenames CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, System.Private.CoreLib, Version=7…
psadapted MemberSet psadapted {Item, IsReadOnly, IsFixedSize, IsSynchronized, Keys, Values, SyncRoot, Count, Add,…
psbase MemberSet psbase {Item, IsReadOnly, IsFixedSize, IsSynchronized, Keys, Values, SyncRoot, Count, Add, Cl…
psextended MemberSet psextended {}
psobject MemberSet psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, TypeNames, get_Membe…
El uso de psobject
es similar al uso de Get-Member
, pero proporciona más flexibilidad. Por ejemplo, puede enumerar las propiedades de un objeto y sus valores.
$hash.psobject.Properties | Select-Object Name, MemberType, Value
Name MemberType Value
---- ---------- -----
IsReadOnly Property False
IsFixedSize Property False
IsSynchronized Property False
Keys Property {Age, Name}
Values Property {33, Bob}
SyncRoot Property {[Age, 33], [Name, Bob]}
Count Property 2
Compárelo con el objeto creado convirtiendo la tabla hash en un PSCustomObject.
$user = [pscustomobject]$hash
$user.psobject.Properties | Select-Object Name, MemberType, Value
Name MemberType Value
---- ---------- -----
Age NoteProperty 33
Name NoteProperty Bob
Observe que las claves de la tabla hash se han convertido en propiedades de la PSCustomObject. Las nuevas propiedades forman parte de psextended
MemberSet.
$user | Get-Member -Force -MemberType MemberSet, CodeProperty
TypeName: System.Management.Automation.PSCustomObject
Name MemberType Definition
---- ---------- ----------
pstypenames CodeProperty System.Collections.ObjectModel.Collection`1[[System.String, System.Private.CoreLib, Version=7…
psadapted MemberSet psadapted {ToString, GetType, Equals, GetHashCode}
psbase MemberSet psbase {ToString, GetType, Equals, GetHashCode}
psextended MemberSet psextended {Age, Name}
psobject MemberSet psobject {Members, Properties, Methods, ImmediateBaseObject, BaseObject, TypeNames, get_Membe…
Información de tipos
El pstypenames
CodeProperty enumera la jerarquía de tipos de objeto en orden de herencia. Por ejemplo:
$file = Get-Item C:\temp\test.txt
$file.pstypenames
System.IO.FileInfo
System.IO.FileSystemInfo
System.MarshalByRefObject
System.Object
La salida comienza con el tipo de objeto más específico, System.IO.FileInfo
y continúa hasta el tipo más genérico, System.Object
.
Métodos
PowerShell agrega dos métodos ocultos a todos los objetos de PowerShell. Estos métodos no son visibles mediante el comando Get-Member -Force
o la finalización con tabulación.
ForEach() y Where()
Los métodos ForEach()
y Where()
están disponibles para todos los objetos de PowerShell.
Sin embargo, son más útiles al trabajar con colecciones. Para obtener más información sobre cómo usar estos métodos, vea about_Arrays.
Propiedades
No todos los tipos escalares poseen las propiedades Count o Length en el tipo base. PowerShell agrega la propiedad que falta como miembro intrínseco para todos los tipos escalares.
Nota
Las variables sin inicializar se $null
implícitamente. $null
es escalar y tiene valores intrínsecos de Count y Length de 0.
Aunque las propiedades Count y Length son similares, pueden funcionar de forma diferente en función del tipo de datos. Por ejemplo, la Longitud de una cadena es el número de caracteres de la cadena. La propiedad Count es el número de instancias del objeto .
PS> $str = 'string'
PS> $str.Length
6
PS> $str.Count
1
Para obtener más información sobre estas propiedades, vea about_Properties.
Indexación de matrices con tipos escalares
Cuando un objeto no es una colección indizada, el uso del operador index para tener acceso al primer elemento devuelve el propio objeto. Los valores de índice más allá del primer elemento devuelven $null
.
PS> (2)[0]
2
PS> (2)[-1]
2
PS> (2)[1] -eq $null
True
PS> (2)[0,0] -eq $null
True
Para obtener más información, consulte about_Operators.
Método New() para tipos
A partir de PowerShell 5.0, PowerShell agrega un método de New()
estático para todos los tipos de .NET. Los ejemplos siguientes generan el mismo resultado.
$expression = New-Object -TypeName regex -ArgumentList 'pattern'
$expression = [regex]::new('pattern')
El uso del método new()
funciona mejor que usar New-Object
.
Para más información, consulte about_Classes (Acerca de las clases).