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