about_Types.ps1xml

Kurze Beschreibung

Erläutert, Types.ps1xml wie Dateien verwendet werden, um die Typen von Objekten zu erweitern, die in PowerShell verwendet werden.

Lange Beschreibung

Erweiterte Typdaten definieren zusätzliche Eigenschaften und Methoden ("Member") von Objekttypen in PowerShell. Es gibt zwei Verfahren zum Hinzufügen erweiterter Typdaten zu einer PowerShell-Sitzung.

  • Types.ps1xml file: Eine XML-Datei, die erweiterte Typdaten definiert.
  • Update-TypeData: Ein Cmdlet, das Dateien neu lädt Types.ps1xml und erweiterte Daten für Typen in der aktuellen Sitzung definiert.

In diesem Thema werden Dateien beschrieben Types.ps1xml . Weitere Informationen zur Verwendung des Update-TypeData Cmdlets zum Hinzufügen dynamischer erweiterter Typdaten zur aktuellen Sitzung finden Sie unter Update-TypeData.

Informationen zu erweiterten Typdaten

Erweiterte Typdaten definieren zusätzliche Eigenschaften und Methoden ("Member") von Objekttypen in PowerShell. Sie können jeden typ erweitern, der von PowerShell unterstützt wird, und die hinzugefügten Eigenschaften und Methoden auf die gleiche Weise verwenden wie die Eigenschaften, die für die Objekttypen definiert sind.

PowerShell fügt beispielsweise allen System.DateTime Objekten eine DateTime-Eigenschaft hinzu, z. B. diejenigen, die das Get-Date Cmdlet zurückgibt.

(Get-Date).DateTime
Sunday, January 29, 2012 9:43:57 AM

Sie finden die DateTime-Eigenschaft nicht in der Beschreibung der System.DateTime-Struktur , da PowerShell die Eigenschaft hinzufügt und nur in PowerShell sichtbar ist.

PowerShell definiert intern einen Standardsatz erweiterter Typen. Diese Typinformationen werden beim Start in jeder PowerShell-Sitzung geladen. Die DateTime-Eigenschaft ist Teil dieses Standardsatzes. Vor PowerShell 6 wurden die Typdefinitionen die Types.ps1xml Datei im PowerShell-Installationsverzeichnis ($PSHOME) gespeichert.

Hinzufügen erweiterter Typdaten zu PowerShell

Es gibt drei Quellen für erweiterte Typdaten in PowerShell-Sitzungen.

  • Erweiterte Typdaten werden von PowerShell definiert und automatisch in jede PowerShell-Sitzung geladen. Ab PowerShell 6 werden diese Informationen in PowerShell kompiliert und nicht mehr in einer Types.ps1xml Datei ausgeliefert.

  • Die Types.ps1xml Dateien, die Module exportieren, werden geladen, wenn das Modul in die aktuelle Sitzung importiert wird.

  • Erweiterte Typdaten, die mit dem Update-TypeData Cmdlet definiert werden, werden nur der aktuellen Sitzung hinzugefügt. Sie wird nicht in einer Datei gespeichert.

In der Sitzung werden die erweiterten Typdaten aus den drei Quellen auf die gleiche Weise auf Objekte angewendet und sind für alle Objekte der angegebenen Typen verfügbar.

Die TypeData-Cmdlets

Die folgenden Cmdlets sind im Modul Microsoft.PowerShell.Utility in PowerShell 3.0 und höher enthalten.

  • Get-TypeData: Ruft erweiterte Typdaten in der aktuellen Sitzung ab.
  • Update-TypeData: Lädt Types.ps1xml Dateien neu. Fügt der aktuellen Sitzung erweiterte Typdaten hinzu.
  • Remove-TypeData: Entfernt erweiterte Typdaten aus der aktuellen Sitzung.

Weitere Informationen zu diesen Cmdlets finden Sie im Hilfethema für jedes Cmdlet.

Integrierte Types.ps1xml-Dateien

Die Types.ps1xml Dateien im $PSHOME Verzeichnis werden automatisch jeder Sitzung hinzugefügt.

Die Types.ps1xml Datei im PowerShell-Installationsverzeichnis ($PSHOME) ist eine XML-basierte Textdatei, mit der Sie den in PowerShell verwendeten Objekten Eigenschaften und Methoden hinzufügen können. PowerShell verfügt über integrierte Dateien, die den .NET-Typen Types.ps1xml mehrere Elemente hinzufügen. Sie können jedoch zusätzliche Types.ps1xml Dateien erstellen, um die Typen weiter zu erweitern.

Beispielsweise verfügen Arrayobjekte (System.Array) standardmäßig über eine Length-Eigenschaft , die die Anzahl der Objekte im Array auflistet. Da der Name Length die Eigenschaft jedoch nicht eindeutig beschreibt, fügt PowerShell eine Aliaseigenschaft namens Count hinzu, die den gleichen Wert anzeigt. Der folgende XML-Code fügt dem Typ die System.Array Count-Eigenschaft hinzu.

<Type>
  <Name>System.Array</Name>
  <Members>
    <AliasProperty>
      <Name>Count</Name>
      <ReferencedMemberName>
        Length
      </ReferencedMemberName>
    </AliasProperty>
  </Members>
</Type>

Um die neue AliasProperty abzurufen, verwenden Sie einen Befehl für ein Get-Member beliebiges Array, wie im folgenden Beispiel gezeigt.

Get-Member -InputObject (1,2,3,4)

Der Befehl gibt die folgenden Ergebnisse zurück.

Name       MemberType    Definition
----       ----------    ----------
Count      AliasProperty Count = Length
Address    Method        System.Object& Address(Int32)
Clone      Method        System.Object Clone()
CopyTo     Method        System.Void CopyTo(Array array, Int32 index):
Equals     Method        System.Boolean Equals(Object obj)
Get        Method        System.Object Get(Int32)
# ...

Daher können Sie entweder die Count-Eigenschaft oder die Length-Eigenschaft von Arrays in PowerShell verwenden. Beispiel:

(1, 2, 3, 4).count
4
(1, 2, 3, 4).length
4

Erstellen neuer Types.ps1xml-Dateien

Die .ps1xml mit PowerShell installierten Dateien werden digital signiert, um Manipulationen zu verhindern, da die Formatierung Skriptblöcke enthalten kann. Um eine Eigenschaft oder Methode zu einem .NET-Typ hinzuzufügen, erstellen Sie daher Ihre eigenen Types.ps1xml Dateien und fügen sie dann Ihrer PowerShell-Sitzung hinzu.

Um eine neue Datei zu erstellen, kopieren Sie zunächst eine vorhandene Types.ps1xml Datei. Die neue Datei kann einen beliebigen Namen haben, muss aber eine .ps1xml Dateierweiterung aufweisen. Sie können die neue Datei in einem beliebigen Verzeichnis platzieren, auf das PowerShell zugreifen kann. Es ist jedoch hilfreich, die Dateien im PowerShell-Installationsverzeichnis ($PSHOME) oder in einem Unterverzeichnis des Installationsverzeichnisses zu platzieren.

Wenn Sie die neue Datei gespeichert haben, fügen Sie die neue Datei mithilfe des Update-TypeData Cmdlets Ihrer PowerShell-Sitzung hinzu. Wenn Ihre Typen Vorrang vor den definierten integrierten Typen haben sollen, verwenden Sie den PrependData-Parameter des Update-TypeData Cmdlets. Update-TypeData wirkt sich nur auf die aktuelle Sitzung aus. Um die Änderung an allen zukünftigen Sitzungen vorzunehmen, exportieren Sie die Konsole, oder fügen Sie den Update-TypeData Befehl Ihrem PowerShell-Profil hinzu.

Types.ps1xml und Add-Member

Die Types.ps1xml Dateien fügen allen Instanzen der Objekte des angegebenen .NET-Typs in der betroffenen PowerShell-Sitzung Eigenschaften und Methoden hinzu. Wenn Sie eigenschaften oder Methoden jedoch nur einer Instanz eines Objekts hinzufügen müssen, verwenden Sie das Add-Member Cmdlet .

Weitere Informationen finden Sie unter Add-Member.

Beispiel: Hinzufügen eines Age-Members zu FileInfo-Objekten

In diesem Beispiel wird gezeigt, wie Eine Age-Eigenschaft zu System.IO.FileInfo-Objekten hinzugefügt wird. Das Alter einer Datei ist der Unterschied zwischen der Erstellungszeit und der aktuellen Zeit in Tagen.

Da die Age-Eigenschaft mithilfe eines Skriptblocks berechnet wird, suchen Sie ein <ScriptProperty> Tag, das als Modell für die neue Age-Eigenschaft verwendet werden soll.

Speichern Sie den folgenden XML-Code in der Datei $PSHOME\MyTypes.ps1xml.

<?xml version="1.0" encoding="utf-8" ?>
<Types>
  <Type>
    <Name>System.IO.FileInfo</Name>
    <Members>
      <ScriptProperty>
        <Name>Age</Name>
        <GetScriptBlock>
          ((Get-Date) - ($this.CreationTime)).Days
        </GetScriptBlock>
      </ScriptProperty>
    </Members>
  </Type>
</Types>

Führen Sie aus Update-TypeData , um die neue Types.ps1xml Datei der aktuellen Sitzung hinzuzufügen. Der Befehl verwendet den PrependData-Parameter , um die neue Datei in einer Rangfolge zu platzieren, die höher als die ursprünglichen Definitionen ist.

Weitere Informationen zu Update-TypeDatafinden Sie unter Update-TypeData.

Update-Typedata -PrependPath $PSHOME\MyTypes.ps1xml

Führen Sie zum Testen der Änderung einen Get-ChildItem Befehl aus, um die PowerShell.exe-Datei im $PSHOME Verzeichnis abzurufen, und leiten Sie die Datei dann an das Format-List Cmdlet weiter, um alle Eigenschaften der Datei aufzulisten. Aufgrund der Änderung wird die Age-Eigenschaft in der Liste angezeigt.

Get-ChildItem $PSHOME\pwsh.exe | Select-Object Age
142

Xml in Types.ps1xml-Dateien

Die vollständige Schemadefinition finden Sie unter Types.xsd im PowerShell-Quellcode-Repository auf GitHub.

Das <Types> -Tag schließt alle Typen ein, die in der Datei definiert sind. Es sollte nur ein <Types> Tag vorhanden sein.

Jeder in der Datei erwähnte .NET-Typ sollte durch ein <Type> -Tag dargestellt werden.

Die Typtags müssen die folgenden Tags enthalten:

<Name>: Schließt den Namen des betroffenen .NET-Typs ein.

<Members>: Schließt die Tags für die neuen Eigenschaften und Methoden ein, die für den .NET-Typ definiert sind.

Jedes der folgenden Membertags kann sich innerhalb des <Members> Tags befinden.

AliasProperty

Definiert einen neuen Namen für eine vorhandene Eigenschaft.

Das <AliasProperty> Tag muss über ein <Name> Tag verfügen, das den Namen der neuen Eigenschaft angibt, und ein <ReferencedMemberName> Tag, das die vorhandene Eigenschaft angibt.

Die Count-Aliaseigenschaft ist beispielsweise ein Alias für die Length-Eigenschaft von Arrayobjekten.

<Type>
  <Name>System.Array</Name>
  <Members>
    <AliasProperty>
      <Name>Count</Name>
      <ReferencedMemberName>Length</ReferencedMemberName>
    </AliasProperty>
  </Members>
</Type>

CodeMethod

Verweist auf eine statische Methode einer .NET-Klasse.

Das <CodeMethod> Tag muss über ein <Name> Tag verfügen, das den Namen der neuen Methode angibt, und ein <CodeReference> Tag, das den Code angibt, in dem die Methode definiert ist.

Die ToString-Methode ist beispielsweise der Name der Codedefinition Microsoft.PowerShell.ToStringCodeMethods .

  <Type>
    <Name>System.Xml.XmlNode</Name>
    <Members>
      <CodeMethod>
        <Name>ToString</Name>
        <CodeReference>
          <TypeName>Microsoft.PowerShell.ToStringCodeMethods</TypeName>
          <MethodName>XmlNode</MethodName>
        </CodeReference>
      </CodeMethod>
    </Members>
  </Type>

CodeProperty

Verweist auf eine statische Methode einer .NET-Klasse.

Das <CodeProperty> Tag muss über ein <Name> Tag verfügen, das den Namen der neuen Eigenschaft angibt, und ein <GetCodeReference> Tag, das den Code angibt, in dem die Eigenschaft definiert ist.

Die Mode-Eigenschaft von System.IO.DirectoryInfo -Objekten ist beispielsweise eine code-Eigenschaft, die im PowerShell FileSystem-Anbieter definiert ist.

<Type>
  <Name>System.IO.DirectoryInfo</Name>
  <Members>
    <CodeProperty>
      <Name>Mode</Name>
      <GetCodeReference>
        <TypeName>
          Microsoft.PowerShell.Commands.FileSystemProvider
        </TypeName>
        <MethodName>Mode</MethodName>
      </GetCodeReference>
    </CodeProperty>
  </Members>
</Type>

MemberSet

Definiert eine Auflistung von Membern (Eigenschaften und Methoden).

Die <MemberSet> Tags werden in den primären <Members> Tags angezeigt. Die Tags müssen ein <Name> Tag um den Namen des Elementsatzes und ein sekundäres <Members> Tag einschließen, das die Elemente (Eigenschaften und Methoden) in der Menge umschließt. Alle Tags, die eine Eigenschaft (z <NoteProperty> . B. oder <ScriptProperty>) oder eine Methode (z <Method> . B. oder <ScriptMethod>) erstellen, können Member der Gruppe sein.

In Types.ps1xml Dateien wird das <MemberSet> -Tag verwendet, um die Standardansichten der .NET-Objekte in PowerShell zu definieren. In diesem Fall lautet der Name des Membersatzes (der Wert innerhalb der <Name> Tags) immer PsStandardMembers, und die Namen der Eigenschaften (der Wert des <Name> Tags) sind einer der folgenden:

  • DefaultDisplayProperty: Eine einzelne Eigenschaft eines Objekts.

  • DefaultDisplayPropertySet: Mindestens eine Eigenschaft eines Objekts.

  • DefaultKeyPropertySet: Mindestens eine Schlüsseleigenschaften eines Objekts. Eine Schlüsseleigenschaft identifiziert Instanzen von Eigenschaftswerten, z. B. die ID-Anzahl von Elementen in einem Sitzungsverlauf.

Der folgende XML-Code definiert beispielsweise die Standardanzeige von Diensten (System.ServiceProcess.ServiceController -Objekten), die vom Cmdlet zurückgegeben Get-Service werden. Sie definiert einen Membersatz mit dem Namen PsStandardMembers , der aus einer Standardeigenschaft besteht, die mit den Eigenschaften Status, Name und DisplayName festgelegt ist.

<Type>
  <Name>System.ServiceProcess.ServiceController</Name>
  <Members>
    <MemberSet>
      <Name>PSStandardMembers</Name>
      <Members>
        <PropertySet>
          <Name>DefaultDisplayPropertySet</Name>
          <ReferencedProperties>
            <Name>Status</Name>
            <Name>Name</Name>
            <Name>DisplayName</Name>
          </ReferencedProperties>
        </PropertySet>
      </Members>
    </MemberSet>
  </Members>
</Type>

<Method>: Verweist auf eine native Methode des zugrunde liegenden Objekts.

<Methods>: Eine Auflistung der Methoden des -Objekts.

NoteProperty

Definiert eine Eigenschaft mit einem statischen Wert.

Das <NoteProperty> Tag muss über ein Tag <Name> verfügen, das den <Value> Namen der neuen Eigenschaft angibt, und ein Tag, das den Wert der Eigenschaft angibt.

Der folgende XML-Code erstellt beispielsweise eine Status-Eigenschaft für System.IO.DirectoryInfo-Objekte . Der Wert der Status-Eigenschaft ist immer Success.

<Type>
  <Name>System.IO.DirectoryInfo</Name>
  <Members>
    <NoteProperty>
      <Name>Status</Name>
      <Value>Success</Value>
    </NoteProperty>
  </Members>
</Type>

PropertySet

Eigenschaften, die Argumente verwenden und einen Wert zurückgeben.

<Properties>: Eine Auflistung der Eigenschaften des -Objekts.

<Property>: Eine Eigenschaft des Basisobjekts.

<PropertySet>: Definiert eine Auflistung von Eigenschaften des -Objekts.

Das <PropertySet> Tag muss über ein Tag <Name> verfügen, das den Namen des Eigenschaftensets angibt, <ReferencedProperty> und ein Tag, das die Eigenschaften angibt. Die Namen der Eigenschaften sind im -Tag <Name> eingeschlossen.

In Types.ps1xmlwerden <PropertySet> Tags verwendet, um Sätze von Eigenschaften für die Standardanzeige eines Objekts zu definieren. Sie können die Standardanzeigen mit dem Wert PsStandardMembers im <Name> Tag eines Tags <MemberSet> identifizieren.

Der folgende XML-Code erstellt beispielsweise ein PropertySet mit dem Namen DefaultDisplayPropertySet mit drei ReferencedProperties.

<Type>
  <Name>System.ServiceProcess.ServiceController</Name>
  <Members>
    <MemberSet>
      <Name>PSStandardMembers</Name>
      <Members>
        <PropertySet>
          <Name>DefaultDisplayPropertySet</Name>
          <ReferencedProperties>
            <Name>Status</Name>
            <Name>Name</Name>
            <Name>DisplayName</Name>
          </ReferencedProperties>
        </PropertySet>
      </Members>
    </MemberSet>
  </Members>
</Type>

ScriptMethod

Definiert eine Methode, deren Wert die Ausgabe eines Skripts ist.

Das <ScriptMethod> -Tag muss über ein - <Name> Tag verfügen <Script> , das den Namen der neuen Methode angibt, und ein Tag, das den Skriptblock einschließt, der das Methodenergebnis zurückgibt.

Beispielsweise sind die Methoden und ConvertFromDateTime ConvertToDateTime von Verwaltungsobjekten (System.System.Management.ManagementObject) Skriptmethoden, die die statischen ToDmtfDateTime ToDateTime Methoden und der -Klasse System.Management.ManagementDateTimeConverter verwenden.

<Type>
 <Name>System.Management.ManagementObject</Name>
 <Members>
 <ScriptMethod>
   <Name>ConvertToDateTime</Name>
   <Script>
   [System.Management.ManagementDateTimeConverter]::ToDateTime($args[0])
   </Script>
 </ScriptMethod>
 <ScriptMethod>
   <Name>ConvertFromDateTime</Name>
   <Script>
   [System.Management.ManagementDateTimeConverter]::ToDmtfDateTime($args[0])
   </Script>
 </ScriptMethod>
 </Members>
</Type>

ScriptProperty

Definiert eine Eigenschaft, deren Wert die Ausgabe eines Skripts ist.

Das <ScriptProperty> Tag muss über ein Tag <Name> verfügen, das den <GetScriptBlock> Namen der neuen Eigenschaft angibt, und ein Tag, das den Skriptblock einschließt, der den Eigenschaftswert zurückgibt.

Beispielsweise ist die VersionInfo-Eigenschaft des System.IO.FileInfo-Objekts eine Skripteigenschaft, die sich aus der Verwendung der FullName-Eigenschaft der statischen GetVersionInfo-Methode von System.Diagnostics.FileVersionInfo-Objekten ergibt.

<Type>
  <Name>System.IO.FileInfo</Name>
  <Members>
    <ScriptProperty>
      <Name>VersionInfo</Name>
      <GetScriptBlock>
      [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName)
      </GetScriptBlock>
    </ScriptProperty>
  </Members>
</Type>

Weitere Informationen finden Sie im Windows PowerShell Software Development Kit (SDK).

Update-TypeData

Führen Sie das Cmdlet Types.ps1xml aus, um Ihre Dateien in eine PowerShell-Sitzung zu Update-TypeData laden. Wenn die Typen in der Datei Vorrang vor Typen in der integrierten Datei haben soll, fügen Sie den PrependData-Parameter Types.ps1xml von hinzuUpdate-TypeData. Update-TypeData wirkt sich nur auf die aktuelle Sitzung aus. Um die Änderung an allen zukünftigen Sitzungen zu ändern, exportieren Sie die Sitzung, oder fügen Sie den Update-TypeData Befehl Ihrem PowerShell-Profil hinzu.

Ausnahmen, die in Eigenschaften oder beim Hinzufügen von Eigenschaften zu einem Update-TypeData Befehl auftreten, melden keine Fehler an StdErr. Dadurch werden Ausnahmen unterdrückt, die während der Formatierung und Ausgabe in vielen gängigen Typen auftreten würden. Wenn Sie .NET-Eigenschaften abrufen, können Sie stattdessen die Unterdrückung von Ausnahmen mithilfe der Methodensyntax umarbeiten, wie im folgenden Beispiel gezeigt:

"hello".get_Length()

Beachten Sie, dass die Methodensyntax nur mit .NET-Eigenschaften verwendet werden kann. Eigenschaften, die durch Ausführen des Cmdlets hinzugefügt Update-TypeData werden, können keine Methodensyntax verwenden.

Signieren einer Types.ps1xml-Datei

Um Benutzer Ihrer Datei zu Types.ps1xml schützen, können Sie die Datei mit einer digitalen Signatur signieren. Weitere Informationen finden Sie unter about_Signing.

Siehe auch