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