about_Types.ps1xml

Kurzbeschreibung

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

Lange Beschreibung

Erweiterte Typdaten definieren zusätzliche Eigenschaften und Methoden ("Members") 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 Types.ps1xml Dateien neu lädt und erweiterte Daten für Typen in der aktuellen Sitzung definiert.

In diesem Thema werden Types.ps1xml-Dateien beschrieben. Weitere Informationen zur Verwendung des Cmdlets Update-TypeData 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 ("Members") 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 Sie die Eigenschaften verwenden, die für die Objekttypen definiert sind.

PowerShell fügt z. B. allen Objekten eine System.DateTime-Eigenschaft hinzu, z. B. denen, die das Cmdlet Get-Date 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 Typdefinitionen in der 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 mithilfe des Cmdlets Update-TypeData definiert werden, werden nur zur aktuellen Sitzung hinzugefügt. Sie wird nicht in einer Datei gespeichert.

In der Sitzung werden die erweiterten Typdaten aus den drei Quellen auf Objekte auf die gleiche Weise angewendet und sind für 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 zu den einzelnen Cmdlets.

Integrierte Types.ps1xml-Dateien

Die Types.ps1xml Dateien im verzeichnis $PSHOME werden jeder Sitzung automatisch 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 Types.ps1xml Dateien, die mehrere Elemente zu .NET-Typen hinzufügen, aber Sie können zusätzliche Types.ps1xml Dateien erstellen, um die Typen weiter zu erweitern.

Standardmäßig weisen Arrayobjekte (System.Array) beispielsweise eine Length-Eigenschaft auf, die die Anzahl der Objekte im Array auflistet. Da der Name Length die Eigenschaft jedoch nicht eindeutig beschreibt, fügt PowerShell eine Aliaseigenschaft mit dem Namen Count hinzu, die denselben Wert anzeigt. Der folgende XML-Code fügt die eigenschaft Count zum System.Array typ hinzu.

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

Um die neue AliasPropertyzu erhalten, 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 Eigenschaft Count oder die Eigenschaft Length von Arrays in PowerShell verwenden. Zum 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 Skriptblocks enthalten kann. Wenn Sie einem .NET-Typ daher eine Eigenschaft oder Methode hinzufügen möchten, erstellen Sie eigene Types.ps1xml Dateien, und fügen Sie 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 über eine .ps1xml Dateinamenerweiterung verfügen. Sie können die neue Datei in jedem Verzeichnis platzieren, auf das PowerShell zugreifen kann, aber es ist nützlich, die Dateien im PowerShell-Installationsverzeichnis ($PSHOME) oder in einem Unterverzeichnis des Installationsverzeichnisses zu platzieren.

Wenn Sie die neue Datei gespeichert haben, verwenden Sie das Cmdlet Update-TypeData, um der PowerShell-Sitzung die neue Datei hinzuzufügen. Wenn Ihre Typen Vorrang vor den definierten integrierten Typen haben sollen, verwenden Sie den parameter "PrependData" des Cmdlets "Update-TypeData". Update-TypeData betrifft nur die aktuelle Sitzung. Wenn Sie die Änderung an allen zukünftigen Sitzungen vornehmen möchten, exportieren Sie die Konsole, oder fügen Sie dem PowerShell-Profil den Befehl Update-TypeData 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 jedoch eigenschaften oder Methoden nur einer Instanz eines Objekts hinzufügen müssen, verwenden Sie das cmdlet Add-Member. Weitere Informationen finden Sie unter Mitglieder hinzufügen.

Beispiel: Hinzufügen eines Alterselements zu FileInfo-Objekten

In diesem Beispiel wird gezeigt, wie 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 Scriptblocks 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 Update-TypeData aus, um der aktuellen Sitzung die neue Types.ps1xml Datei hinzuzufügen. Der Befehl verwendet den Parameter PrependData, 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

Um die Änderung zu testen, führen Sie einen Get-ChildItem Befehl aus, um die powershell.exe Datei im verzeichnis $PSHOME abzurufen, und leiten Sie die Datei dann an das Cmdlet Format-List weiter, um alle Eigenschaften der Datei aufzulisten. Aufgrund der Änderung wird die eigenschaft Age in der Liste angezeigt.

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

Xml 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.

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

Beispielsweise ist die Count-Eigenschaft ein Alias für die Length-Eigenschaft von Array-Objekten.

<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, das den Code angibt, 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, das den Code angibt, in dem die Eigenschaft definiert ist.

Beispielsweise ist die Mode Eigenschaft von System.IO.DirectoryInfo Objekten 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 Mitgliedersatzes und ein sekundäres <Members>-Tag einschließen, das die Mitglieder (Eigenschaften und Methoden) im Satz umschließt. Alle Tags, die eine Eigenschaft (z. B. <NoteProperty> oder <ScriptProperty>) oder eine Methode (z. B. <Method> oder <ScriptMethod>) erstellen, können Elemente des Satzes 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 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: Eine oder mehrere Eigenschaften eines Objekts.

  • DefaultKeyPropertySet: Eine oder mehrere Schlüsseleigenschaften eines Objekts. Eine Schlüsseleigenschaft identifiziert Eigenschaftswerte, wie die ID-Nummer von Elementen in einer Sitzungshistorie.

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

<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>
        <NoteProperty>
          <Name>DefaultDisplayProperty</Name>
          <Value>Name</Value>
        </NoteProperty>
      </Members>
    </MemberSet>
  </Members>
</Type>

<Method>: Verweist auf eine systemeigene 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, das den Wert der Eigenschaft angibt.

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

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

PropertySet

Eigenschaften, die Argumente annehmen 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, das die Eigenschaften angibt. Die Namen der Eigenschaften werden im <Name>-Tag eingeschlossen.

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

Mit dem folgenden XML-Code wird beispielsweise ein PropertySet- namens DefaultDisplayPropertySet mit drei ReferencedProperties erstellt.

<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, das den Scriptblock einschließt, der das Methodenergebnis zurückgibt.

Beispielsweise sind die ConvertToDateTime- und ConvertFromDateTime Methoden von Verwaltungsobjekten (System.System.Management.ManagementObject) Skriptmethoden, die die statischen Methoden ToDateTime und ToDmtfDateTime 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 angibt, und ein <GetScriptBlock> Tag, das den Scriptblock einschließt, der den Eigenschaftswert zurückgibt.

Die VersionInfo-Eigenschaft des System.IO.FileInfo-Objekts ist beispielsweise eine Skripteigenschaft, die aus der Verwendung der FullName-Eigenschaft resultiert, die in der statischen Methode GetVersionInfo der System.Diagnostics.FileVersionInfo-Objekte verwendet wird.

<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 Update-TypeData Dateien in eine PowerShell-Sitzung zu laden. Wenn die Typen in Ihrer Datei Vorrang vor Typen in der integrierten Types.ps1xml-Datei haben sollen, fügen Sie den PrependData Parameter von Update-TypeDatahinzu. Update-TypeData betrifft nur die aktuelle Sitzung. Wenn Sie die Änderung an allen zukünftigen Sitzungen vornehmen möchten, exportieren Sie die Sitzung, oder fügen Sie dem PowerShell-Profil den Befehl Update-TypeData hinzu.

Ausnahmen, die in Eigenschaften auftreten, oder das Hinzufügen von Eigenschaften zu einem Update-TypeData-Befehl, melden keine Fehler an StdErr. Dies dient dazu, Ausnahmen zu unterdrücken, die bei vielen üblichen Typen während der Formatierung und Ausgabe auftreten würden. Wenn Sie .NET-Eigenschaften abrufen, 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 Cmdlets Update-TypeData hinzugefügt werden, können keine Methodensyntax verwenden.

Signieren einer Types.ps1xml-Datei

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

Siehe auch