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 ("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 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 ("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 DateTime-Eigenschaft hinzu, z. B. die, die das Get-Date Cmdlet zurückgibt.System.DateTime

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

Die DateTime-Eigenschaft wird in der Beschreibung der System.DateTime-Struktur nicht gefunden, 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 im Types.ps1xml 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 Update-TypeData Cmdlets 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 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 Dateien neu Types.ps1xml . 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 $PSHOME Verzeichnis 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 Dateien, die mehrere Elemente zu .NET-Typen Types.ps1xml hinzufügen, aber Sie können zusätzliche Types.ps1xml Dateien erstellen, um die Typen weiter zu erweitern.

Arrayobjekte (System.Array) verfügen beispielsweise 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 denselben Wert anzeigt. Der folgende XML-Code fügt die Count-Eigenschaft dem System.Array Typ hinzu.

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

Verwenden Sie zum Abrufen des neuen AliasProperty 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 Types.ps1xml-Dateien

Die .ps1xml mit PowerShell installierten Dateien werden digital signiert, um Manipulationen zu verhindern, da die Formatierung Skriptblöcke 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 Update-TypeData Cmdlet, 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 Update-TypeData Cmdlets. 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 Update-TypeData Befehl 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 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 Alterselements 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 nach einem <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 die Ausführung aus Update-TypeData , um die neue Types.ps1xml Datei zur aktuellen Sitzung 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 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 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 .NET-Typ Erwähnung in der Datei 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.

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 und ein <CodeReference> Tag angibt, mit dem der Code angegeben wird, 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 und ein <GetCodeReference> Tag angibt, mit 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 Member (Eigenschaften und Methoden) in den Satz einschließt. Alle Tags, die eine Eigenschaft (z <NoteProperty> . B. oder <ScriptProperty>) oder eine Methode (z <Method> . B. 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 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 Eigenschaftswerten, z. B. die ID-Anzahl von Elementen in einem Sitzungsverlauf.

Mit dem folgenden XML-Code wird beispielsweise die Standardanzeige von Diensten (System.ServiceProcess.ServiceController Objekten) definiert, 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 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 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.

Mit dem folgenden XML-Code wird beispielsweise eine Status-Eigenschaft für System.IO.DirectoryInfo-Objekte erstellt. 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 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 sind im <Name> Tag eingeschlossen.

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

Mit dem folgenden XML-Code wird beispielsweise ein PropertySet mit dem Namen 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 angibt, und ein <Script> Tag, das den Skriptblock einschließt, der das Methodenergebnis zurückgibt.

Beispielsweise sind die ConvertToDateTime Methoden und ConvertFromDateTime 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, das den Skriptblock einschließt, der den Eigenschaftswert zurückgibt.

Die VersionInfo-Eigenschaft des System.IO.FileInfo-Objekts ist beispielsweise 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 Update-TypeData Cmdlet aus, um Ihre Types.ps1xml 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 Parameter PrependData hinzu Update-TypeData. 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 Update-TypeData Befehl hinzu.

Ausnahmen, die in Eigenschaften auftreten, oder das 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 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 Update-TypeData Cmdlets 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.

Weitere Informationen