about_Types.ps1xml

Kurze Beschreibung

Erläutert, wie Sie Dateien verwenden Types.ps1xml , 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 Techniken zum Hinzufügen erweiterter Typdaten zu einer PowerShell-Sitzung.

  • Types.ps1xml datei: 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 zum Verwenden 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 dieselbe Weise verwenden, wie Sie die Eigenschaften verwenden, die auf den Objekttypen definiert sind.

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

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

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

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

Hinzufügen erweiterter Typdaten zu PowerShell

Es gibt drei Quellen erweiterter 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 werden in einer Types.ps1xml Datei nicht mehr gesendet.

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

  • Erweiterte Typdaten, die mithilfe des Update-TypeData Cmdlets definiert werden, werden nur zur aktuellen Sitzung hinzugefügt. Es wird nicht in einer Datei gespeichert.

In der Sitzung wird die erweiterte Typdaten aus den drei Quellen auf Objekte auf dieselbe Weise angewendet und auf alle Objekte der angegebenen Typen verfügbar.

Die TypeData-Cmdlets

Die folgenden Cmdlets sind im Microsoft.PowerShell.Utility-Modul 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 Typen.ps1xml-Dateien

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

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

Standardmäßig verfügen Arrayobjekte (System.Array) über eine Length-Eigenschaft , die die Anzahl der Objekte im Array aufgibt. Da der Name Length die Eigenschaft jedoch nicht eindeutig beschreibt, fügt PowerShell eine Aliaseigenschaft namens Count hinzu, die denselben Wert anzeigt. Im folgenden XML wird der System.Array Typ "Count" die Count-Eigenschaft hinzugefügt.

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

Um den neuen AliasProperty abzurufen, verwenden Sie einen Get-Member Befehl auf einem beliebigen 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. Zum Beispiel:

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

Erstellen neuer Typen.ps1xml-Dateien

Die dateien, die mit PowerShell installiert sind, werden digital signiert, um Manipulationen zu verhindern, da die .ps1xml Formatierung Skriptblöcke enthalten kann. Zum Hinzufügen einer Eigenschaft oder Methode zu einem .NET-Typ erstellen Sie daher eigene Types.ps1xml Dateien, und fügen Sie sie dann ihrer PowerShell-Sitzung hinzu.

Um eine neue Datei zu erstellen, beginnen Sie mit dem Kopieren einer vorhandenen Types.ps1xml Datei. Die neue Datei kann einen beliebigen Namen haben, muss jedoch eine .ps1xml Dateinamenerweiterung haben. Sie können die neue Datei in einem beliebigen Verzeichnis platzieren, auf das PowerShell zugegriffen werden kann, aber es ist nützlich, die Dateien im PowerShell-Installationsverzeichnis ($PSHOME) oder in einem Unterverzeichnis des Installationsverzeichniss zu platzieren.

Wenn Sie die neue Datei gespeichert haben, verwenden Sie das Update-TypeData Cmdlet, um der PowerShell-Sitzung die neue Datei hinzuzufügen. Wenn Ihre Typen Vorrang vor den integrierten Typen haben möchten, die definiert sind, 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 dem PowerShell-Profil den Update-TypeData Befehl hinzu.

Types.ps1xml und Add-Member

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

Weitere Informationen finden Sie unter Add-Member.

Beispiel: Hinzufügen eines Altersmitglieds zu FileInfo-Objekten

In diesem Beispiel wird gezeigt, wie Sie system.IO.FileInfo-Objekte eine Age-Eigenschaft hinzufügen. Das Alter einer Datei ist der Unterschied zwischen der Erstellungszeit und der aktuellen Uhrzeit in Tagen.

Da die Age-Eigenschaft mithilfe eines Skriptblocks berechnet wird, finden 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 Update-TypeData die Datei aus, um der aktuellen Sitzung die neue Types.ps1xml Datei hinzuzufügen. Der Befehl verwendet den PrependData-Parameter , um die neue Datei in einer Rangfolge höher als die ursprünglichen Definitionen zu platzieren.

Weitere Informationen finden Update-TypeDataSie unter Update-TypeData.

Update-Typedata -PrependPath $PSHOME\MyTypes.ps1xml

Um die Änderung zu testen, führen Sie einen Get-ChildItem Befehl aus, um die PowerShell.exe Datei im $PSHOME Verzeichnis abzurufen, und leiten Sie dann die Datei an das Format-List Cmdlet, um alle Eigenschaften der Datei auflisten zu können. Aufgrund der Änderung wird die Age-Eigenschaft in der Liste angezeigt.

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

Die XML-Dateien in Types.ps1xml-Dateien

Die vollständige Schemadefinition finden Sie in 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.

Jeder 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 und ein <ReferencedMemberName> Tag angibt, der die vorhandene Eigenschaft angibt.

Die Count-Alias-Eigenschaft 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 und ein <CodeReference> Tag angibt, in dem der Code angegeben wird, in dem die Methode definiert ist.

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

  <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 und ein <GetCodeReference> Tag angibt, in dem der Code angegeben wird, in dem die Eigenschaft definiert ist.

Die Mode-Eigenschaft von System.IO.DirectoryInfo Objekten ist beispielsweise eine Codeeigenschaft, 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 Elementen (Eigenschaften und Methoden).

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

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

  • DefaultDisplayProperty: Eine einzelne Eigenschaft eines Objekts.

  • DefaultDisplayPropertySet: Eine oder mehrere Eigenschaften eines Objekts.

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

Die folgende XML definiert beispielsweise die Standardanzeige von Diensten (System.ServiceProcess.ServiceController Objekten), die vom Get-Service Cmdlet zurückgegeben werden. Es definiert einen Membersatz namens PsStandardMembers , der aus einer Standardeigenschaft besteht, die mit den Eigenschaften "Status", " Name" und " DisplayName " besteht.

<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 <Name> Tag verfügen, das den Namen der neuen Eigenschaft und ein <Value> Tag angibt, der den Wert der Eigenschaft angibt.

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

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

PropertySet

Eigenschaften, die Argumente übernehmen 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 <Name> Tag verfügen, das den Namen des Eigenschaftensatzes und ein <ReferencedProperty> Tag angibt, der die Eigenschaften angibt. Die Namen der Eigenschaften werden im <Name> Tag eingeschlossen.

In Types.ps1xml, <PropertySet> Tags werden verwendet, um Sätze von Eigenschaften für die Standardanzeige eines Objekts zu definieren. Sie können die Standardanzeigen anhand des <Name> Werts PsStandardMembers im Tag eines <MemberSet> Tags identifizieren.

Die folgende XML erstellt beispielsweise ein PropertySet namens 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, das den Namen der neuen Methode und ein <Script> Tag angibt, der den Skriptblock einschließt, der das Methodenergebnis zurückgibt.

Beispielsweise sind die ConvertToDateTimeConvertFromDateTime Methoden und Methoden von Verwaltungsobjekten (System.System.Management.ManagementObject) Skriptmethoden, die die ToDateTime und ToDmtfDateTime statischen Methoden der System.Management.ManagementDateTimeConverter Klasse 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 <Name> Tag verfügen, das den Namen der neuen Eigenschaft und ein <GetScriptBlock> Tag angibt, der den Skriptblock einschließt, der den Eigenschaftswert zurückgibt.

Die VersionInfo-Eigenschaft des System.IO.FileInfo-Objekts ist beispielsweise eine Skripteigenschaft, die aus der FullName-Eigenschaft der statischen Methode"System.Diagnostics.FileVersionInfo " resultiert.

<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 Update-TypeData Cmdlet aus, um Ihre Types.ps1xml Dateien in eine PowerShell-Sitzung zu laden. Wenn Sie möchten, dass die Typen in Ihrer Datei Vorrang vor Typen in der integrierten Types.ps1xml Datei haben, fügen Sie den Parameter PrependData hinzu.Update-TypeData Update-TypeData Wirkt sich nur auf die aktuelle Sitzung aus. Um die Änderung an allen zukünftigen Sitzungen vorzunehmen, exportieren Sie die Sitzung oder fügen Sie dem PowerShell-Profil den Update-TypeData Befehl hinzu.

Ausnahmen, die in Eigenschaften auftreten, oder von dem Hinzufügen von Eigenschaften zu einem Update-TypeData Befehl, 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 erhalten, können Sie stattdessen mithilfe der Methodensyntax die Unterdrückung von Ausnahmen umgehen, 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 Update-TypeData Cmdlets hinzugefügt werden, können keine Methodensyntax verwenden.

Signieren einer Datei "Types.ps1xml"

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

Siehe auch