Panoramica del sistema di tipi estesiExtended Type System Overview

PowerShell usa l'oggetto PSObject per estendere i tipi di oggetti in due modi.PowerShell uses its PSObject object to extend the types of objects in two ways. In primo luogo, l'oggetto PSObject fornisce un modo per mostrare visualizzazioni diverse di tipi di oggetti specifici.First, the PSObject object provides a way to show different views of specific object types. Questa operazione viene definita visualizzazione adatta di un oggetto.This is referred to as showing an adapted view of an object. In secondo luogo, l'oggetto PSObject fornisce un modo per aggiungere membri a un oggetto esistente.Second, the PSObject object provides a way to add members to existing object. Insieme, eseguendo il wrapping di un oggetto esistente, denominato oggetto di base, l'oggetto PSObject fornisce un sistema di tipi esteso (ETS) che gli sviluppatori di script e cmdlet possono usare per modificare gli oggetti .NET all'interno della 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.

Problemi di sviluppo di cmdlet e scriptCmdlet and Script Development Issues

ETS risolve due problemi fondamentali:ETS resolves two fundamental issues:

Per prima cosa, alcuni oggetti .NET non hanno il comportamento predefinito necessario per fungere da dati tra i cmdlet.First, some .NET Objects do not have the necessary default behavior for acting as the data between cmdlets.

  • Alcuni oggetti .NET sono oggetti "meta" (ad esempio: oggetti WMI, oggetti ADO e oggetti XML) i cui membri descrivono i dati che contengono.Some .NET objects are "meta" objects (for example: WMI Objects, ADO objects, and XML objects) whose members describe the data they contain. Tuttavia, in un ambiente di scripting sono i dati contenuti più interessanti, non la descrizione dei dati contenuti.However, in a scripting environment it is the contained data that is most interesting, not the description of the contained data. ETS risolve questo problema introducendo la nozione di adapter che adattano l'oggetto .NET sottostante per avere la semantica predefinita prevista.ETS resolves this issue by introducing the notion of Adapters that adapt the underlying .NET object to have the expected default semantics.
  • Alcuni membri di oggetti .NET sono denominati in modo incoerente, forniscono un set di membri pubblici insufficiente o forniscono una capacità insufficiente.Some .NET Object members are inconsistently named, provide an insufficient set of public members, or provide insufficient capability. ETS risolve questo problema introducendo la possibilità di estendere l'oggetto .NET con membri aggiuntivi.ETS resolves this issue by introducing the ability to extend the .NET object with additional members.

In secondo luogo, il linguaggio di scripting di PowerShell non è di tipo in quanto non è necessario dichiarare una variabile di un determinato tipo.Second, the PowerShell scripting language is typeless in that a variable does not need to be declared of a particular type. Ovvero le variabili create da uno sviluppatore di script sono per natura.That is, the variables a script developer creates are by nature typeless. Tuttavia, il sistema PowerShell è "basato sui tipi" in quanto dipende dalla presenza di un nome di tipo da utilizzare per le operazioni di base, ad esempio l'output dei risultati o l'ordinamento.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.

Uno sviluppatore di script deve pertanto avere la possibilità di dichiarare il tipo di una delle relative variabili e di creare il proprio set di "oggetti" tipizzati dinamicamente che contengono proprietà e metodi e possono partecipare al sistema basato sui tipi.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 risolve questo problema fornendo un oggetto comune per il linguaggio di scripting in grado di dichiarare il tipo in modo dinamico e di aggiungere membri in modo dinamico.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.

Fondamentalmente, ETS risolve il problema indicato in precedenza fornendo l'oggetto PSObject , che funge da base per l'accesso a tutti gli oggetti dal linguaggio di scripting e fornisce un'astrazione standard per lo sviluppatore di cmdlet.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.

Sviluppatori di cmdletCmdlet Developers

Per gli sviluppatori di cmdlet, ETS fornisce il seguente supporto:For the cmdlet developers, ETS provides the following support:

  • Astrazioni per lavorare sugli oggetti in modo generico usando l'oggetto PSObject .The abstractions to work against objects in a generic way using the PSObject object. ETS fornisce anche la possibilità di eseguire il drill-through di queste astrazioni, se necessario.ETS also provides the ability to drill past these abstractions if required.
  • Meccanismi per creare un comportamento predefinito per la formattazione, l'ordinamento, la serializzazione e altre manipolazioni del sistema del relativo tipo di oggetto utilizzando un set noto di membri estesi.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.
  • Consente di operare su qualsiasi oggetto utilizzando la stessa semantica del linguaggio di script utilizzando un oggetto LanguagePrimitives.The means to operate against any object using the same semantics as the script language using a LanguagePrimitives object.
  • I mezzi per "digitare" dinamicamente una tabella hash in modo che il resto del sistema possa funzionare in modo efficace.The means to dynamically "type" a hash table so that the rest of the system can operate against it effectively.

Sviluppatori di scriptScript Developers

Per gli sviluppatori di script, ETS fornisce il seguente supporto:For the script developers, ETS provides the following support:

  • La possibilità di fare riferimento a qualsiasi tipo di oggetto sottostante utilizzando la stessa sintassi ( $a.x ).The ability to reference any underlying object type using the same syntax ($a.x).
  • Possibilità di accedere oltre l'astrazione fornita dall'oggetto PSObject , ad esempio l'accesso solo a membri adattati o l'accesso all'oggetto di base stesso.The ability to access beyond the abstraction provided by the PSObject object (such as accessing only adapted members, or accessing the base object itself).
  • Possibilità di definire membri noti che controllano la formattazione, l'ordinamento, la serializzazione e altre modifiche di un'istanza o di un tipo di oggetto.The ability to define well-known members that control the formatting, sorting, serialization, and other manipulations of an object instance or type.
  • Consente di assegnare un nome a un oggetto come tipo specifico e di controllare quindi l'ereditarietà dei membri basati sul tipo.The means to name an object as a specific type and thus control the inheritance of its type-based members.
  • Possibilità di aggiungere, rimuovere e modificare membri estesi.The ability to add, remove, and modify extended members.
  • Possibilità di modificare l'oggetto PSObject se necessario.The ability to manipulate the PSObject object itself if required.

Classe PSObjectThe PSObject class

L'oggetto PSObject è la base di tutti gli accessi agli oggetti dal linguaggio di scripting e fornisce un'astrazione standard per lo sviluppatore di cmdlet.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 oggetto di base (un oggetto .NET) e tutti i membri di istanza (membri, in particolare i membri estesi, presenti in una particolare istanza di oggetto, ma non necessariamente in altri oggetti dello stesso 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). A seconda del tipo di oggetto di base, l'oggetto PSObject può anche fornire l'accesso implicito ed esplicito a membri adattati, nonché a qualsiasi membro esteso basato sul tipo.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.

L'oggetto PSObject fornisce i meccanismi seguenti:The PSObject object provides the following mechanisms:

  • Possibilità di costruire un PSObject con o senza un oggetto di base.The ability to construct an PSObject with or without a base-object.
  • Possibilità di accedere a tutti i membri di ogni oggetto PSObject costruito tramite un algoritmo di ricerca comune e la possibilità di eseguire l'override di tale algoritmo quando necessario.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.
  • Possibilità di ottenere e impostare i nomi dei tipi degli oggetti PSObject costruiti in modo che gli script e i cmdlet possano fare riferimento a oggetti PSObject simili con lo stesso nome di tipo, indipendentemente dal tipo di oggetto di 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.

Come costruire un PSObjectHow to Construct a PSObject

Nell'elenco seguente vengono descritte le modalità di creazione di un oggetto PSObject :The following list describes ways to create a PSObject object:

  • Chiamando il costruttore PSObject . #ctor viene creato un nuovo oggetto PSObject con un oggetto di base di PSCustomObject.Calling the PSObject .#ctor constructor creates a new PSObject object with a base-object of PSCustomObject. Un oggetto di base di questo tipo indica che l'oggetto PSObject non dispone di un oggetto base significativo.A base-object of this type indicates that the PSObject object has no meaningful base-object. Tuttavia, un oggetto PSObject con questo tipo di oggetto base fornisce un contenitore di proprietà che gli sviluppatori di cmdlet possono trovare utili aggiungendo membri estesi.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.

Gli sviluppatori possono inoltre specificare il nome del tipo di oggetto, che consente a questo oggetto di condividere i membri estesi con altri oggetti PSObject con lo stesso nome di 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.

  • Chiamando il costruttore PSObject . #ctor (System. Object) viene creato un nuovo oggetto PSObject con un oggetto di base di tipo System. Object.Calling the PSObject .#ctor(System.Object) constructor creates a new PSObject object with a base-object of type System.Object.

    In questo caso, il nome del tipo per l'oggetto creato è una raccolta della gerarchia di derivazione dell'oggetto di base.In this case, the type-name for the created object is a collection of the derivation hierarchy of the base-object. Ad esempio, il nome del tipo per PSObject che contiene un oggetto di base ProcessInfo include i nomi seguenti: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
  • Chiamata a PSObject . Il metodo AsPSObject (System. Object) crea un nuovo oggetto PSObject in base a un oggetto fornito.Calling the PSObject .AsPSObject(System.Object) method creates a new PSObject object based on a supplied object.

    Se l'oggetto fornito è di tipo System. Object, l'oggetto fornito viene usato come oggetto di base per il nuovo oggetto PSObject .If the supplied object is of type System.Object, the supplied object is used as the base-object for the new PSObject object. Se l'oggetto fornito è già un oggetto PSObject , l'oggetto fornito viene restituito così com'è.If the supplied object is already an PSObject object, the supplied object is returned as is.

Membri di base, adattati ed estesiBase, adapted, and extended members

Dal punto di vista concettuale, ETS usa i termini seguenti per mostrare la relazione tra i membri originali dell'oggetto di base e i membri aggiunti da 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. Per ulteriori informazioni sui tipi specifici di membri utilizzati dall'oggetto PSObject , vedere classe PSObject.For more information about the specific types of members that are used by the PSObject object, see PSObject class.

Membri oggetto di baseBase-object members

Se l'oggetto base viene specificato durante la costruzione degli oggetti PSObject , i membri dell'oggetto base vengono resi disponibili tramite la proprietà 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.

Membri adattatiAdapted members

Quando un oggetto di base è un metaoggetto, che contiene dati in modo generico le cui proprietà "descrivono" i dati contenuti, ETS adatta tali oggetti a una vista che consente l'accesso diretto ai dati attraverso membri adattati dell'oggetto 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. I membri adattati e i membri base-oggetto sono accessibili tramite la proprietà Members.Adapted members and base-object members are accessed through the Members property.

Membri estesiExtended members

Oltre ai membri resi disponibili dall'oggetto di base o dai membri adattati creati da PowerShell, un PSObject può anche definire membri estesi che estendono l'oggetto di base originale con informazioni aggiuntive utili nell'ambiente di 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.

Ad esempio, tutti i cmdlet di base forniti da PowerShell, come i cmdlet Get-Content e set-content, accettano un parametro path.For example, all the core cmdlets provided by PowerShell, such as the Get-Content and Set-Content cmdlets, take a path parameter. Per assicurarsi che questi cmdlet e altri utenti possano lavorare su oggetti di tipi diversi, è possibile aggiungere un membro del percorso a tali oggetti in modo che tutti i relativi dati siano stati in modo comune.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. Questo membro del percorso esteso garantisce che i cmdlet possano funzionare con tutti questi tipi anche se la classe base potrebbe non avere un membro del percorso.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.

Tutti i membri estesi, i membri adattati e i membri di un oggetto di base sono accessibili tramite la proprietà Members.Extended members, adapted members, and base-object members are all accessed through the Members property.