THEMA
about_Types.ps1xml
KURZBESCHREIBUNG
Erläutert, wie Sie mit den Types.ps1xml-Dateien die Microsoft
.NET Framework-Typen der Objekte erweitern können, die in Windows
PowerShell verwendet werden.
DETAILBESCHREIBUNG
Die Datei "Types.ps1xml" im Windows PowerShell-Installationsverzei
chnis ("$pshome") ist eine XML-basierte Textdatei, mit der Sie
den Objekten, die in Windows PowerShell verwendet werden,
Eigenschaften und Methoden hinzufügen können. Windows PowerShell
verfügt über eine integrierte Types.ps1xml-Datei, mit der .NET
Framework-Typen mehrere Elemente hinzugefügt werden. Sie können
jedoch zusätzliche Types.ps1xml-Dateien erstellen, um die Typen
darüber hinaus zu erweitern.
Arrayobjekte (System.Array) weisen beispielsweise standardmäßig
eine length-Eigenschaft auf, die die Anzahl der Objekte im Array
angibt. Da die Eigenschaft mit dem Namen "length" jedoch nur
unzureichend beschrieben wird, fügt Windows PowerShell eine
Aliaseigenschaft mit dem Namen "Count" hinzu, die den gleichen
Wert anzeigt. Mit dem folgenden XML wird dem System.Array-Typ die
Count-Eigenschaft hinzugefügt.
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>
Length
</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
Um die neue AliasProperty abzurufen, verwenden Sie einen
Get-Member-Befehl für jedes Array, wie im folgenden Beispiel
veranschaulicht wird.
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 )
...
Sie können daher die Count-Eigenschaft oder die Length-Eigenschaft
von Arrays in Windows PowerShell verwenden. Beispiel:
C:\PS> (1, 2, 3, 4).count
4
C:\PS> (1, 2, 3, 4).length
4
Erstellen neuer Types.ps1xml-Dateien
Die mit Windows PowerShell installierten PS1XML-Dateien werden
digital signiert, um Manipulationen zu verhindern, da die
Formatierung Skriptblöcke enthalten kann. Erstellen Sie daher
eigene Types.ps1xml-Dateien und fügen Sie diese der Windows
PowerShell-Konsole hinzu, um einem .NET Framework-Typ eine
Eigenschaft oder eine Methode hinzuzufügen.
Um eine neue Datei zu erstellen, kopieren Sie zunächst eine
vorhandene Types.ps1xml-Datei. Die neue Datei kann beliebig
benannt werden, jedoch muss sie die Dateinamenerweiterung
".ps1xml" aufweisen. Sie können die neue Datei in ein
beliebiges Verzeichnis einfügen, auf das Windows PowerShell
zugreifen kann, es ist jedoch sinnvoll, die Dateien im Windows
PowerShell-Installationsverzeichnis ("$pshome") oder in einem
Unterverzeichnis des Installationsverzeichnisses zu speichern.
Wenn Sie die neue Datei gespeichert haben, fügen Sie sie mit
dem Cmdlet "Update-TypeData" der Windows PowerShell-Konsole
hinzu. Wenn eigene Typen Vorrang gegenüber den Typen in der
integrierten Datei haben sollen, verwenden Sie den
PrependData-Parameter des Cmdlets "Update-TypeData".
Update-TypeData wirkt sich nur auf die aktuelle Konsole aus.
Exportieren Sie die Konsole, oder fügen Sie dem Windows
PowerShell-Profil den Befehl "Update-TypeData" hinzu, um die
Änderung für alle zukünftigen Konsolen zu übernehmen.
Types.ps1xml und Add-Member
Die Types.ps1xml-Dateien fügen allen Instanzen der Objekte des
angegebenen .NET Framework-Typs in der betroffenen Windows
PowerShell-Konsole Eigenschaften und Methoden hinzu. Wenn Sie
jedoch Eigenschaften oder Methoden lediglich einer Instanz
eines Objekts hinzufügen müssen, verwenden Sie das Cmdlet
"Add-Member".
Weitere Informationen finden Sie unter "Add-Member".
Beispiel: Hinzufügen eines Age-Elements zu FileInfo-Objekten
In diesem Beispiel wird veranschaulicht, wie Dateiobjekten
(System.IO.FileInfo) eine Age-Eigenschaft hinzugefügt wird. Das
Alter einer Datei ergibt sich aus dem Unterschied zwischen der
Erstellungszeit und der aktuellen Zeit in Tagen.
Am besten verwenden Sie die ursprüngliche Types.ps1xml-Datei
als Vorlage für die neue Datei. Mit dem nachfolgenden Befehl
wird die ursprüngliche Datei in die Datei "MyTypes.ps1xml" im
Verzeichnis "$pshome" kopiert.
copy-item Types.ps1xml MyTypes.ps1xml
Öffnen Sie anschließend die Datei "Types.ps1xml" in einem
beliebigen XML- oder Text-Editor, beispielsweise Editor.
Verwenden Sie ein <ScriptProperty>-Tag als Vorbild für die neue
Age-Eigenschaft, da die Age-Eigenschaft mit einem Skriptblock
berechnet wird.
Kopieren Sie das XML zwischen dem <Type>-Tag und dem
</Type>-Tag des Codes, um die Skripteigenschaft zu erstellen.
Löschen Sie anschließend den verbleibenden Teil der Datei bis
auf das öffnende <?xml>-Tag und das öffnende <Types>-Tag sowie
das schließende </Types>-Tag. Um Fehler zu vermeiden, muss auch
die digitale Signatur gelöscht werden.
Beginnen Sie mit der Modellskripteigenschaft, beispielsweise
mit der nachfolgend angegebenen Skripteigenschaft, die aus der
ursprünglichen Types.ps1xml-Datei kopiert wurde.
<?xml version="1.0" encoding="utf-8" ?>
<Types>
<Type>
<Name>System.Guid</Name>
<Members>
<ScriptProperty>
<Name>Guid</Name>
<GetScriptBlock>$this.ToString()</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
Ändern Sie anschließend den Namen des .NET Framework-Typs, den
Namen der Eigenschaft und den Wert des Skriptblocks, um eine
Age-Eigenschaft für Dateiobjekte zu erstellen.
<?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>
Speichern und schließen Sie die Datei, und fügen Sie der
aktuellen Konsole die neue Types.ps1xml-Datei mit einem
Update-TypeData-Befehl wie dem folgenden hinzu. Mit dem Befehl
wird der PrependData-Parameter verwendet, um die neue Datei an
einer höheren Stelle in der Rangfolge einzufügen als die
ursprüngliche Datei. (Weitere Informationen über Update-TypeData
finden Sie unter "Update-TypeData".)
update-typedata -prependpath $pshome\MyTypes.ps1xml
Um die Änderung zu testen, verwenden Sie den Befehl
"Get-ChildItem", um die Datei "PowerShell.exe" im Verzeichnis
"$pshome" abzurufen, und übergeben Sie dann die Datei über die
Pipeline an das Cmdlet "Format-List", um alle Eigenschaften der
Datei aufzuführen. Nach der Änderung wird die Age-Eigenschaft
in der Liste angezeigt.
get-childitem $pshome\powershell.exe | format-list -property *
PSPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS...
PSParentPath : Microsoft.PowerShell.Core\FileSystem::C:\WINDOWS...
PSChildName : powershell.exe
PSDrive : C
PSProvider : Microsoft.PowerShell.Core\FileSystem
PSIsContainer : False
Age : 16
VersionInfo : File: C:\WINDOWS\system32\WindowsPow...
InternalName: POWERSHELL
OriginalFilename: PowerShell.EXE
...
Sie können die Age-Eigenschaft der Datei auch mit folgendem
Befehl anzeigen:
(get-childitem $pshome\powershell.exe).age
16
XML in Types.ps1xml-Dateien
Das <Types>-Tag schließt alle Typen ein, die in der Datei
definiert wurden.
Es sollte nur ein Paar <Types>-Tags verwendet werden.
Jeder in der Datei enthaltene .NET Framework-Typ sollte durch
ein Paar <Type>-Tags dargestellt werden.
Die Type-Tags müssen folgende Tags enthalten:
<Name>: Ein Paar <Name>-Tags, die den Namen des betreffenden
.NET Framework-Typs einschließen.
<Members>: Ein Paar <Members>-Tags, die die Tags für die
neuen Eigenschaften und Methoden einschließen,
die für den .NET Framework-Typ definiert werden.
<Members>-Tags können alle nachfolgend angegebenen Elementtags
enthalten.
<AliasProperty>: Definiert einen neuen Namen für eine
vorhandene Eigenschaft.
Das <AliasProperty>-Tag muss über ein Paar <Name>-Tags
verfügen, die den Namen der neuen Eigenschaft angeben, sowie
über ein Paar <ReferencedMemberName>-Tags, die die
vorhandene Eigenschaft angeben.
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
Framework-Klasse.
Das <CodeMethod>-Tag muss über ein Paar <Name>-Tags
verfügen, die den Namen der neuen Methode angeben, sowie
über ein Paar <GetCodeReference>-Tags, die den Code mit der
Definition der Methode angeben.
Die Mode-Eigenschaft von Verzeichnissen (System.IO.DirectoryI
nfo- Objekte) ist beispielsweise eine Codeeigenschaft, die
im Windows PowerShell-Dateisystemanbieter definiert wird.
<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>
<CodeMethod>: Verweist auf eine statische Methode einer .NET
Framework-Klasse.
Das <CodeProperty>-Tag muss über ein Paar <Name>-Tags
verfügen, die den Namen der neuen Eigenschaft angeben, sowie
über ein Paar <GetCodeReference>-Tags, die den Code mit der
Definition der Eigenschaft angeben.
Die Mode-Eigenschaft von Verzeichnissen (System.IO.DirectoryI
nfo- Objekte) ist beispielsweise eine Codeeigenschaft, die
im Windows PowerShell-Dateisystemanbieter definiert wird.
<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. Diese müssen ein Paar <Name>-Tags
einschließen, zwischen denen der Name des Elementsatzes
sowie ein Paar sekundäre <Members>-Tags notiert werden, die
die Elemente (Eigenschaften und Methoden) im Satz
einschließen. Alle Tags, mit denen eine Eigenschaft
(beispielsweise <NoteProperty> oder <ScriptProperty> oder
eine Methode (beispielsweise <Method> oder <ScriptMethod>)
erstellt wird, können Elemente des Satzes sein.
In Types.ps1xml-Dateien wird das <MemberSet>-Tag verwendet,
um die Standardansichten der .NET Framework-Objekte in Windows
PowerShell zu definieren. In diesem Fall ist der Name des
Elementsatzes (der Wert in den <Name>-Tags) immer
"PsStandardMembers", und die Namen der Eigenschaftentags
(der Wert von <Name>) sind einer der folgenden:
- DefaultDisplayProperty: Eine einzelne Eigenschaft eines Objekts.
- DefaultDisplayPropertySet: Eine oder mehrere
Eigenschaften eines Objekts.
- DefaultKeyPropertySet: Eine oder mehrere Schlüsseleigens
chaften eines Objekts. Eine Schlüsseleigenschaft
identifiziert Instanzen von Eigenschaftenwerten,
beispielsweise die ID-Nummer von Elementen in einem
Sitzungsverlauf.
Das folgende XML definiert z. B. die Standardanzeige von Diensten
(System.ServiceProcess.ServiceController-Objekte), die vom Cmdlet
"Get-Service" zurückgegeben werden. Darin wird der Elementsatz
"PsStandardMembers" definiert, der aus einem Standardeigenschaftensatz
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 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 Paar <Name>-Tags
verfügen, die den Namen der neuen Eigenschaft angeben, sowie
über ein Paar <Value>-Tags, die den Wert der Eigenschaft angeben.
Beispielsweise wird mit dem folgenden XML eine
Status-Eigenschaft für Verzeichnisse (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>
<ParameterizedProperty>: Eigenschaften, die Argumente
akzeptieren und einen Wert zurückgeben.
<Properties>: Eine Auflistung der Eigenschaften des
Auflistungsobjekts.
<Property>: Eine Eigenschaft des Basisobjekts.
<PropertySet>: Definiert eine Auflistung von Eigenschaften des
Objekts.
Das <PropertySet>-Tag muss über ein Paar <Name>-Tags
verfügen, die den Namen des Eigenschaftensatzes angeben,
sowie über ein Paar <ReferencedProperty>-Tags, die die
Eigenschaften angeben. Der Name einer Eigenschaft wird
jeweils in ein Paar <Name>-Tags eingeschlossen.
In Types.ps1xml werden <PropertySet>-Tags verwendet, um
Eigenschaftensätze für die Standardanzeige eines Objekts zu
definieren. Sie können die Standardanzeigen mit dem Wert
"PsStandardMembers" im <Name>-Tag eines <MemberSet>-Tags
definieren.
Beispielsweise wird mit dem folgenden XML eine
Status-Eigenschaft für Verzeichnisse (System.IO.DirectoryInfo
-Objekte) erstellt. Der Wert der Status-Eigenschaft ist
immer "Success".
<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 Paar <Name>-Tags
verfügen, die den Namen der neuen Methode angeben, sowie
über ein Paar <Script>-Tags, die den Skriptblock
einschließen, der das Methodenergebnis zurückgibt.
Beispielsweise verwenden die ConvertToDateTime-Skriptmethode
und die ConvertFromDateTime-Skriptmethode von Verwaltungsobjekten
(System.System.Management.ManagementObject) die statische
ToDateTime-Methode und die statische ToDmtfDateTime-Methode der
System.Management.ManagementDateTimeConverter-Klasse.
<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 Paar <Name>-Tags
verfügen, die den Namen der neuen Eigenschaft angeben, sowie
über ein Paar <GetScriptBlock>-Tags, die den Skriptblock
einschließen, der den Eigenschaftenwert zurückgibt.
Beispielsweise ist die VersionInfo-Eigenschaft von Dateien
(System.IO.FileInfo-Objekte) eine Skripteigenschaft, die aus
der Verwendung der FullName-Eigenschaft der statischen
GetVersionInfo-Methode von System.Diagnostics.FileVersionInfo
-Objekten 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 Software
Development Kit (SDK) in der MSDN (Microsoft Developer Network)
Library unter https://go.microsoft.com/fwlink/?LinkId=144538 (möglicherweise auf
Englisch).
Update-TypeData
Um die Types.ps1xml-Dateien in eine Windows PowerShell-Konsole
zu laden, verwenden Sie das Cmdlet "Update-TypeData". Wenn die
Typen in der Datei Vorrang vor den Typen in der integrierten
Types.ps1xml-Datei haben sollen, verwenden Sie den
PrependData-Parameter von Update-TypeData. Update-TypeData
wirkt sich nur auf die aktuelle Konsole aus. Exportieren Sie
die Konsole, oder fügen Sie dem Windows PowerShell-Profil den
Befehl "Update-TypeData" hinzu, um die Änderung für alle
zukünftigen Konsolen zu übernehmen.
Signieren einer Types.ps1xml-Datei
Zum Schutz der Benutzer der Types.ps1xml-Datei können Sie die
Datei mit einer digitalen Signatur signieren. Weitere
Informationen finden Sie unter "about_Signing".
SIEHE AUCH
about_Signing
Copy-Item
Get-Member
Update-TypeData