Información general sobre el sistema de tipos extendidosExtended Type System Overview

PowerShell usa su objeto PSObject para ampliar los tipos de objetos de dos maneras.PowerShell uses its PSObject object to extend the types of objects in two ways. En primer lugar, el objeto PSObject proporciona una manera de mostrar diferentes vistas de tipos de objeto específicos.First, the PSObject object provides a way to show different views of specific object types. Esto se conoce como mostrar una vista adaptada de un objeto.This is referred to as showing an adapted view of an object. En segundo lugar, el objeto PSObject proporciona una manera de agregar miembros a un objeto existente.Second, the PSObject object provides a way to add members to existing object. Juntos, al ajustar un objeto existente, denominado objeto base, el objeto PSObject proporciona un sistema de tipos extendido (ETS) que los desarrolladores de scripts y cmdlets pueden usar para manipular objetos .net en el shell.Together, by wrapping an existing object, referred to as the base object, the PSObject object provides an extended type system (ETS) that script and cmdlet developers can use to manipulate .NET objects within the shell.

Problemas de desarrollo de cmdlets y scriptsCmdlet and Script Development Issues

ETS resuelve dos problemas fundamentales:ETS resolves two fundamental issues:

En primer lugar, algunos objetos .NET no tienen el comportamiento predeterminado necesario para actuar como datos entre los cmdlets.First, some .NET Objects do not have the necessary default behavior for acting as the data between cmdlets.

  • Algunos objetos .NET son objetos "meta" (por ejemplo: objetos WMI, objetos ADO y objetos XML) cuyos miembros describen los datos que contienen.Some .NET objects are "meta" objects (for example: WMI Objects, ADO objects, and XML objects) whose members describe the data they contain. Sin embargo, en un entorno de scripting, es el contenido de los datos que es más interesante, no la descripción de los datos contenidos.However, in a scripting environment it is the contained data that is most interesting, not the description of the contained data. ETS resuelve este problema introduciendo la noción de adaptadores que adaptan el objeto .NET subyacente para tener la semántica predeterminada esperada.ETS resolves this issue by introducing the notion of Adapters that adapt the underlying .NET object to have the expected default semantics.
  • Algunos miembros del objeto .NET tienen un nombre incoherente, proporcionan un conjunto insuficiente de miembros públicos o proporcionan una capacidad insuficiente.Some .NET Object members are inconsistently named, provide an insufficient set of public members, or provide insufficient capability. ETS resuelve este problema mediante la introducción de la capacidad de extender el objeto .NET con miembros adicionales.ETS resolves this issue by introducing the ability to extend the .NET object with additional members.

En segundo lugar, el lenguaje de scripting de PowerShell no tiene tipo , en el que no es necesario declarar una variable de un tipo determinado.Second, the PowerShell scripting language is typeless in that a variable does not need to be declared of a particular type. Es decir, las variables que crea un desarrollador de script son por naturaleza sin tipo.That is, the variables a script developer creates are by nature typeless. Sin embargo, el sistema de PowerShell está "controlado por tipos" en que depende de tener un nombre de tipo con el que trabajar para operaciones básicas, como la salida de resultados o la ordenación.However, the PowerShell system is "type-driven" in that it depends on having a type name to operate against for basic operations such as outputting results or sorting.

Por lo tanto, un desarrollador de scripts debe tener la capacidad de indicar el tipo de una de sus variables y compilar su propio conjunto de "objetos" de tipo dinámico que contienen propiedades y métodos y pueden participar en el sistema controlado por tipos.Therefore a script developer must have the ability to state the type of one of their variables and build up their own set of dynamically typed "objects" that contain properties and methods and can participate in the type-driven system. ETS soluciona este problema proporcionando un objeto común para el lenguaje de scripting que tiene la capacidad de indicar su tipo dinámicamente y agregar miembros de forma dinámica.ETS solves this problem by providing a common object for the scripting language that has the ability to state its type dynamically and to add members dynamically.

Fundamentalmente, ETS resuelve el problema mencionado anteriormente proporcionando el objeto PSObject , que actúa como base de todo el acceso a los objetos del lenguaje de scripting y proporciona una abstracción estándar para el desarrollador de cmdlets.Fundamentally, ETS resolves the issue mentioned previously by providing the PSObject object, which acts as the basis of all object access from the scripting language and provides a standard abstraction for the cmdlet developer.

Desarrolladores de cmdletsCmdlet Developers

Para los desarrolladores de cmdlets, ETS proporciona la siguiente compatibilidad:For the cmdlet developers, ETS provides the following support:

  • Abstracciones para trabajar con objetos de una forma genérica mediante el objeto PSObject .The abstractions to work against objects in a generic way using the PSObject object. ETS también proporciona la capacidad de profundizar en estas abstracciones si es necesario.ETS also provides the ability to drill past these abstractions if required.
  • Mecanismos para crear un comportamiento predeterminado para el formato, la ordenación, la serialización y otras manipulaciones del sistema de su tipo de objeto mediante un conjunto conocido de miembros extendidos.The mechanisms to create a default behavior for formatting, sorting, serialization, and other system manipulations of their object type using a well-known set of extended members.
  • Los medios para operar con cualquier objeto usando la misma semántica que el lenguaje de script mediante un objeto LanguagePrimitives.The means to operate against any object using the same semantics as the script language using a LanguagePrimitives object.
  • Significa que se debe "escribir" dinámicamente una tabla hash para que el resto del sistema pueda trabajar con ella de manera eficaz.The means to dynamically "type" a hash table so that the rest of the system can operate against it effectively.

Desarrolladores de scriptsScript Developers

Para los desarrolladores de scripts, ETS proporciona la siguiente compatibilidad:For the script developers, ETS provides the following support:

  • La capacidad de hacer referencia a cualquier tipo de objeto subyacente mediante la misma sintaxis ( $a.x ).The ability to reference any underlying object type using the same syntax ($a.x).
  • La capacidad de obtener acceso más allá de la abstracción proporcionada por el objeto PSObject (como el acceso solo a miembros adaptados o el acceso al propio objeto base).The ability to access beyond the abstraction provided by the PSObject object (such as accessing only adapted members, or accessing the base object itself).
  • La capacidad de definir miembros conocidos que controlan el formato, la ordenación, la serialización y otras manipulaciones de una instancia de objeto o tipo.The ability to define well-known members that control the formatting, sorting, serialization, and other manipulations of an object instance or type.
  • Significa que se debe asignar un nombre a un objeto como un tipo específico y, por tanto, controlar la herencia de sus miembros basados en tipos.The means to name an object as a specific type and thus control the inheritance of its type-based members.
  • La capacidad de agregar, quitar y modificar miembros extendidos.The ability to add, remove, and modify extended members.
  • La capacidad de manipular el propio objeto PSObject si es necesario.The ability to manipulate the PSObject object itself if required.

La clase PSObjectThe PSObject class

El objeto PSObject es la base de todos los accesos a objetos del lenguaje de scripting y proporciona una abstracción estándar para el desarrollador de cmdlets.The PSObject object is the basis of all object access from the scripting language and provides a standard abstraction for the cmdlet developer. Contiene un objeto base (un objeto .NET) y cualquier miembro de instancia (miembros, específicamente miembros extendidos, que están presentes en una instancia de objeto determinada, pero no necesariamente en otros objetos del mismo tipo).It contains a base-object (a .NET object) and any instance members (members, specifically extended members, that are present on a particular object instance while not necessarily on other objects of the same type). Dependiendo del tipo del objeto base, el objeto PSObject también podría proporcionar acceso implícito y explícito a los miembros adaptados, así como a los miembros extendidos basados en tipos.Depending on the type of the base-object, the PSObject object might also provide implicit and explicit access to adapted members as well as any type-based extended members.

El objeto PSObject proporciona los siguientes mecanismos:The PSObject object provides the following mechanisms:

  • La capacidad de construir un PSObject con o sin un objeto base.The ability to construct an PSObject with or without a base-object.
  • La capacidad de obtener acceso a todos los miembros de cada objeto PSObject construido a través de un algoritmo de búsqueda común y la capacidad de invalidar ese algoritmo cuando sea necesario.The ability to access of all members of each constructed PSObject object through a common lookup algorithm and the ability to override that algorithm when required.
  • La capacidad de obtener y establecer los nombres de tipo de los objetos psobject construidos para que los scripts y los cmdlets puedan hacer referencia a objetos psobject similares con el mismo nombre de tipo, independientemente del tipo de su objeto base.The ability to get and set the type-names of the constructed PSObject objects so that scripts and cmdlets can reference similar PSObject objects by the same type-name, regardless of the type of their base-object.

Cómo construir un PSObjectHow to Construct a PSObject

En la lista siguiente se describen las distintas formas de crear un objeto PSObject :The following list describes ways to create a PSObject object:

  • Al llamar al constructor psobject . #ctor, se crea un nuevo objeto PSObject con un objeto base de PSCustomObject.Calling the PSObject .#ctor constructor creates a new PSObject object with a base-object of PSCustomObject. Un objeto base de este tipo indica que el objeto PSObject no tiene ningún objeto base significativo.A base-object of this type indicates that the PSObject object has no meaningful base-object. Sin embargo, un objeto PSObject con este tipo de objeto base proporciona un contenedor de propiedades que los desarrolladores de cmdlet pueden encontrar útiles agregando miembros extendidos.However, a PSObject object with this type of base-object does provide a property bag that cmdlet developers can find helpful by adding extended-members.

Los desarrolladores también pueden especificar el tipo de objeto-Name, que permite a este objeto compartir sus miembros extendidos con otros objetos PSObject del mismo nombre de tipo.Developers can also specify the object type-name, which allows this object to share its extended-members with other PSObject objects of the same type-name.

  • La llamada al constructor psobject . #ctor (System. Object) crea un nuevo objeto PSObject con un objeto base de tipo System. Object.Calling the PSObject .#ctor(System.Object) constructor creates a new PSObject object with a base-object of type System.Object.

    En este caso, el nombre de tipo del objeto creado es una colección de la jerarquía de derivación del objeto base.In this case, the type-name for the created object is a collection of the derivation hierarchy of the base-object. Por ejemplo, el nombre de tipo del PSObject que contiene un objeto base ProcessInfo incluiría los nombres siguientes:For example, the type-name for the PSObject that contains a ProcessInfo base-object would include the following names:

    • System.Diagnostics.ProcessSystem.Diagnostics.Process
    • System. ComponentModel. ComponentSystem.ComponentModel.Component
    • System.MarshalByRefObjectSystem.MarshalByRefObject
    • System.ObjectSystem.Object
  • Llamar a PSObject . El método AsPSObject (System. Object) crea un nuevo objeto PSObject basado en un objeto proporcionado.Calling the PSObject .AsPSObject(System.Object) method creates a new PSObject object based on a supplied object.

    Si el objeto proporcionado es de tipo System. Object, el objeto proporcionado se utiliza como el objeto base para el nuevo objeto PSObject .If the supplied object is of type System.Object, the supplied object is used as the base-object for the new PSObject object. Si el objeto proporcionado ya es un objeto PSObject , el objeto proporcionado se devuelve tal cual.If the supplied object is already an PSObject object, the supplied object is returned as is.

Miembros base, adaptados y extendidosBase, adapted, and extended members

Conceptualmente, ETS usa los siguientes términos para mostrar la relación entre los miembros originales del objeto base y los miembros agregados por PowerShell.Conceptually, ETS uses the following terms to show the relationship between the original members of the base-object and those members added by PowerShell. Para obtener más información sobre los tipos específicos de miembros que usa el objeto PSObject , vea psobject (clase).For more information about the specific types of members that are used by the PSObject object, see PSObject class.

Miembros de objeto baseBase-object members

Si el objeto base se especifica al construir los objetos PSObject , los miembros del objeto base se ponen a disposición a través de la propiedad members.If the base-object is specified when constructing the PSObject objects, then the members of the base-object are made available through the Members property.

Miembros adaptadosAdapted members

Cuando un objeto base es un metaobjeto, uno que contiene datos de un modo genérico cuyas propiedades "describen" sus datos contenidos, ETS adapta esos objetos a una vista que permite el acceso directo a los datos a través de los miembros adaptados del objeto PSObject .When a base-object is a meta-object, one that contains data in a generic fashion whose properties "describe" their contained data, ETS adapts those objects to a view that allows for direct access to the data through adapted members of the PSObject object. Se obtiene acceso a los miembros adaptados y a los miembros de objeto base a través de la propiedad members.Adapted members and base-object members are accessed through the Members property.

Miembros extendidosExtended members

Además de los miembros que se ponen a disposición del objeto base o de los miembros adaptados creados por PowerShell, un PSObject también puede definir miembros extendidos que extienden el objeto base original con información adicional útil en el entorno de scripting.In addition to the members made available from the base-object or those adapted members created by PowerShell, an PSObject may also define extended members that extend the original base-object with additional information that is useful in the scripting environment.

Por ejemplo, todos los cmdlets principales que proporciona PowerShell, como los cmdlets Get-Content y set-Content, toman un parámetro Path.For example, all the core cmdlets provided by PowerShell, such as the Get-Content and Set-Content cmdlets, take a path parameter. Para asegurarse de que estos cmdlets, y otros, pueden trabajar con objetos de tipos diferentes, se puede Agregar un miembro de ruta de acceso a esos objetos para que todos puedan indicar su información de una manera común.To ensure that these cmdlets, and others, can work against objects of different types, a Path member can be added to those objects so that they all state their information in a common way. Este miembro de ruta de acceso extendida garantiza que los cmdlets puedan funcionar con todos esos tipos, aunque la clase base no tenga un miembro de ruta de acceso.This extended Path member ensures that the cmdlets can work against all those types even though there base class might not have a Path member.

Se tiene acceso a los miembros extendidos, miembros adaptados y miembros de objeto base a través de la propiedad members.Extended members, adapted members, and base-object members are all accessed through the Members property.