TEMA about_Types.ps1xml DESCRIPCIÓN BREVE Explica cómo los archivos Types.ps1xml permiten extender los tipos de Microsoft .NET Framework de los objetos que se utilizan en Windows PowerShell. DESCRIPCIÓN DETALLADA El archivo Types.ps1xml ubicado en el directorio de instalación de Windows PowerShell (pshome $) es un archivo de texto basado en XML que permite agregar propiedades y métodos a los objetos que se utilizan en Windows PowerShell. Windows PowerShell tiene un archivo Types.ps1xml integrado que agrega varios elementos a los tipos de .NET Framework, pero se pueden crear archivos Types.ps1xml adicionales para extender aún más los tipos. Por ejemplo, de forma predeterminada, los objetos de matriz (System.Array) tienen una propiedad Length que muestra el número de objetos en la matriz. Sin embargo, como el nombre "length" no describe claramente la propiedad, Windows PowerShell agrega una propiedad de alias denominada "Count" que muestra el mismo valor. El código XML siguiente agrega la propiedad Count al tipo System.Array. <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName> Length </ReferencedMemberName> </AliasProperty> </Members> </Type> Para obtener el nuevo miembro AliasProperty, utilice un comando Get-Member en cualquier matriz, como se muestra en el ejemplo siguiente. Get-Member -inputobject (1,2,3,4) El comando devuelve los resultados siguientes. 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 ) ... Como consecuencia, se puede utilizar la propiedad Count o la propiedad Length de matrices en Windows PowerShell. Por ejemplo: C:\PS> (1, 2, 3, 4).count 4 C:\PS> (1, 2, 3, 4).length 4 Crear archivos Types.ps1xml Los archivos .ps1xml que se instalan con Windows PowerShell están firmados digitalmente para evitar la alteración porque el formato puede incluir bloques de script. Por consiguiente, para agregar una propiedad o un método a un tipo de .NET Framework, hay que crear archivos Types.ps1xml propios y, a continuación, agregarlos a la consola de Windows PowerShell. Para crear un archivo, empiece copiando un archivo Types.ps1xml existente. El nuevo archivo puede tener cualquier nombre pero debe tener la extensión .ps1xml. Puede colocar el nuevo archivo en cualquier directorio que sea accesible para Windows PowerShell, pero es útil colocar los archivos en el directorio de instalación de Windows PowerShell ($pshome) o en un subdirectorio del directorio de instalación. Una vez guardado el nuevo archivo, utilice el cmdlet Update-TypeData para agregarlo a la consola de Windows PowerShell. Si desea que los tipos tengan prioridad sobre los tipos definidos en el archivo integrado, utilice el parámetro PrependData del cmdlet Update-TypeData. Update-TypeData afecta solamente a la consola actual. Para realizar el cambio en todas las consolas futuras, exporte la consola o agregue el comando Update-TypeData al perfil de Windows PowerShell. Types.ps1xml y Add-Member Los archivos Types.ps1xml agregan propiedades y métodos a todas las instancias de los objetos del tipo de .NET Framework especificado en la consola de Windows PowerShell afectada. Sin embargo, si necesita agregar propiedades o métodos sólo a una instancia de un objeto, utilice el cmdlet Add-Member. Para obtener más información, vea Add-Member. Ejemplo: Agregar un miembro Age a objetos FileInfo En este ejemplo se muestra la forma de agregar una propiedad Age a objetos de archivo (System.IO.FileInfo). La antigüedad de un archivo es la diferencia entre la fecha de su creación y la fecha actual en días. Es más fácil utilizar el archivo Types.ps1xml original como plantilla para el nuevo archivo. El comando siguiente copia el archivo original en un archivo denominado MyTypes.ps1xml en el directorio $pshome. copy-item Types.ps1xml MyTypes.ps1xml Seguidamente, abra el archivo Types.ps1xml en cualquier editor de texto o XML, como el Bloc de notas. Como la propiedad Age se calcula usando un bloque de script, busque una etiqueta <ScriptProperty> para usarla como modelo para la nueva propiedad Age. Copie el contenido XML entre las etiquetas <Type> y </Type> del código para crear la propiedad de script. A continuación, elimine el resto del archivo, excepto las etiquetas de apertura <?xml> y <Types> y la etiqueta de cierre </Types>. También debe eliminar la firma digital para evitar errores. Empiece con la propiedad de script de modelo, como la propiedad de script siguiente, que se copió del archivo Types.ps1xml original. <?xml version="1.0" encoding="utf-8" ?> <Types> <Type> <Name>System.Guid</Name> <Members> <ScriptProperty> <Name>Guid</Name> <GetScriptBlock>$this.ToString()</GetScrip tBlock> </ScriptProperty> </Members> </Type> </Types> A continuación, cambie el nombre del tipo de .NET Framework, el nombre de la propiedad y el valor del bloque de script para crear una propiedad Age para objetos de archivo. <?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> Después de guardar el archivo y cerrarlo, utilice un comando Update-TypeData, como el comando siguiente, para agregar el nuevo archivo Types.ps1xml a la consola actual. El comando utiliza el parámetro PrependData para colocar el nuevo archivo en un orden de prioridad más alto que el del archivo original. Para obtener más información acerca de Update-TypeData, vea Update-TypeData. update-typedata -prependpath $pshome\MyTypes.ps1xml Para probar el cambio, utilice un comando Get-ChildItem para obtener el archivo PowerShell.exe en el directorio $pshome y, a continuación, canalice el archivo al cmdlet Format-List para mostrar todas las propiedades del archivo. La consecuencia del cambio es que la propiedad Age aparece en la lista. 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 ... También puede mostrar la propiedad Age del archivo utilizando el comando siguiente. (get-childitem $pshome\powershell.exe).age 16 El contenido XML en archivos Types.ps1xml Las etiquetas <Type> incluyen todos los tipos que se definen en el archivo. Debe haber sólo un par de etiquetas <Type>. Cada tipo de .NET Framework mencionado en el archivo debe estar representado por un par de etiquetas <Type>. Las etiquetas de tipo deben contener las etiquetas siguientes: <Name>: Un par de etiquetas <Name> que incluyen el nombre del .tipo de .NET Framework afectado. <Members>: Un par de etiquetas <Members> que incluyen las etiquetas de las nuevas propiedades y métodos que se definen para el tipo de .NET Framework. Cualquiera de las etiquetas de miembro siguientes puede estar dentro de las etiquetas <Members>. <AliasProperty>: Define un nuevo nombre para una propiedad existente. La etiqueta <AliasProperty> debe tener un par de etiquetas <Name> que especifican el nombre de la nueva propiedad y un par de etiquetas <ReferencedMemberName> que especifican la propiedad existente. Por ejemplo, la propiedad de alias Count es un alias para la propiedad Length de objetos de matriz. <Type> <Name>System.Array</Name> <Members> <AliasProperty> <Name>Count</Name> <ReferencedMemberName>Length</ReferencedMemberName> </AliasProperty> </Members> </Type> <CodeMethod>: Hace referencia a un método estático de una clase de .NET Framework. La etiqueta <CodeMethod> debe tener un par de etiquetas <Name> que especifican el nombre del nuevo método y un par de etiquetas <GetCodeReference> que especifican el código en que se define el método. Por ejemplo, la propiedad Mode de directorios (objetos System.IO.DirectoryInfo) es una propiedad de código definida en el proveedor FileSystem de Windows PowerShell. <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> <CodeProperty>: Hace referencia a un método estático de una clase de .NET Framework. La etiqueta <CodeProperty> debe tener un par de etiquetas <Name> que especifican el nombre de la nueva propiedad y un par de etiquetas <GetCodeReference> que especifican el código en que se define la propiedad. Por ejemplo, la propiedad Mode de directorios (objetos System.IO.DirectoryInfo) es una propiedad de código definida en el proveedor FileSystem de Windows PowerShell. <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>: Define una colección de miembros (propiedades y métodos). Las etiquetas <MemberSet> aparecen dentro de las etiquetas <Members> principales. Las etiquetas deben incluir un par de etiquetas <Name> que incluyen el nombre del conjunto de miembros y un par de etiquetas <Members> secundarias que incluyen los miembros (propiedades y métodos) del conjunto. Cualquiera de las etiquetas que crean una propiedad (como <NoteProperty> o <ScriptProperty>) o un método (como <Method> o <ScriptMethod>) pueden ser miembros del conjunto. En los archivos Types.ps1xml, la etiqueta <MemberSet> se utiliza para definir las vistas predeterminadas de los objetos de .NET Framework en Windows PowerShell. En este caso, el nombre del conjunto de miembros (el valor incluido dentro de las etiquetas <Name>) siempre es "PsStandardMembers" y los nombres de la etiqueta de propiedades (el valor de <Name>) son uno de los siguientes: - DefaultDisplayProperty: Una sola propiedad de un objeto. - DefaultDisplayPropertySet: Una o más propiedades de un objeto. - DefaultKeyPropertySet: Una o más propiedades clave de un objeto. Una propiedad clave identifica instancias de valores de propiedad, como el número de identificación de elementos en el historial de una sesión. Por ejemplo, el contenido XML siguiente define la presentación predeterminada de los servicios (objetos System.ServiceProcess.ServiceController) devueltos por el cmdlet Get-Service. Define un conjunto de miembros denominado "PsStandardMemb ers" que consta de un conjunto de propiedades predeterminado con las propiedades Status, Name y DisplayName. <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>: Hace referencia a un método nativo del objeto subyacente. <Methods>: Una colección de los métodos del objeto. <NoteProperty>: Define una propiedad con un valor estático. La etiqueta <NoteProperty> debe tener un par de etiquetas <Name> que especifican el nombre de la nueva propiedad y un par de etiquetas <Value> que especifican el valor de la propiedad. Por ejemplo, el contenido XML siguiente crea una propiedad Status para directorios (objetos System.IO.DirectoryInfo). El valor de la propiedad Status siempre es "Success". <Type> <Name>System.IO.DirectoryInfo</Name> <Members> <NoteProperty> <Name>Status</Name> <Value>Success</Value> </NoteProperty> </Members> </Type> <ParameterizedProperty>: Propiedades que toman los argumentos y devuelven un valor. <Properties>: Una colección de las propiedades del objeto. <Property>: Una propiedad del objeto base. <PropertySet>: Define una colección de propiedades del objeto. La etiqueta <PropertySet> debe tener un par de etiquetas <Name> que especifican el nombre del conjunto de propiedades y un par de etiquetas <ReferencedProperty> que especifican las propiedades. Los nombres de las propiedades se incluyen en pares de etiquetas <Name>. En Types.ps1xml, las etiquetas <PropertySet> se utilizan para definir conjuntos de propiedades para la presentación predeterminada de un objeto. Se puede identificar la presentación predeterminada mediante el valor "PsStandardMemb ers" en la etiqueta <Name> de una etiqueta <MemberSet>. Por ejemplo, el contenido XML siguiente crea una propiedad Status para directorios (objetos System.IO.DirectoryInfo). El valor de la propiedad Status siempre es "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>: Define un método cuyo valor es el resultado de un script. La etiqueta <ScriptMethod> debe tener un par de etiquetas <Name> que especifican el nombre del nuevo método y un par de etiquetas <Script> que incluyen el bloque de script que devuelve el resultado del método. Por ejemplo, los métodos ConvertFromDateTime y ConvertToDateTime de objetos de administración (System.System.Management.ManagementObject) son métodos de script que utilizan los métodos estáticos ToDmtfDateTime y ToDateTime de la clase System.Management.ManagementDateTimeConverter. <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>: Define una propiedad cuyo valor es el resultado de un script. La etiqueta <ScriptProperty> debe tener un par de etiquetas <Name> que especifican el nombre de la nueva propiedad y un par de etiquetas <GetScriptBlock> que incluyen el bloque de script que devuelve el valor de la propiedad. Por ejemplo, la propiedad VersionInfo de archivos (objetos System.IO.FileInfo) es una propiedad de script que resulta de utilizar la propiedad FullName del método estático GetVersionInfo de objetos System.Diagnostics.FileVersionInfo. <Type> <Name>System.IO.FileInfo</Name> <Members> <ScriptProperty> <Name>VersionInfo</Name> <GetScriptBlock> [System.Diagnostics.FileVersionInfo]::GetVersionInfo($this.FullName) </GetScriptBlock> </ScriptProperty> </Members> </Type> Para obtener más información, vea el Kit de desarrollo de software de Windows PowerShell (SDK) en MSDN (Microsoft Developer Network) Library, en https://go.microsoft.com/fwlink/?L inkId=144538. Update-TypeData Para cargar los archivos Types.ps1xml en una consola de Windows PowerShell, utilice el cmdlet Update-TypeData. Si desea que los tipos de su archivo tengan prioridad sobre los tipos del archivo Types.ps1xml integrado, utilice el parámetro PrependData del cmdlet Update-TypeData. Update-TypeData afecta solamente a la consola actual. Para realizar el cambio en todas las consolas futuras, exporte la consola o agregue el comando Update-TypeData al perfil de Windows PowerShell. Firmar un archivo Types.ps1xml Para proteger a los usuarios de su archivo Types.ps1xml, puede firmar el archivo con una firma digital. Para obtener más información, vea about_Signing. VEA TAMBIÉN about_Signing Copy-Item Get-Member Update-TypeData