about_Types.ps1xml
Descripción breve
Explica cómo usar archivos Types.ps1xml para ampliar los tipos de objetos que se usan en PowerShell.
Descripción larga
Los datos de tipo extendido definen propiedades y métodos adicionales ("miembros") de tipos de objeto en PowerShell. Hay dos técnicas para agregar datos de tipo extendidos a una sesión de PowerShell.
Types.ps1xmlfile: un archivo XML que define datos de tipo extendido.Update-TypeData: cmdlet que recarga losTypes.ps1xmlarchivos y define los datos extendidos para los tipos de la sesión actual.
En este tema se describen Types.ps1xml los archivos. Para obtener más información sobre el uso del cmdlet para agregar datos de tipo extendido dinámico a Update-TypeData la sesión actual, vea Update-TypeData.
Acerca de los datos de tipo extendido
Los datos de tipo extendido definen propiedades y métodos adicionales ("miembros") de tipos de objeto en PowerShell. Puede extender cualquier tipo que sea compatible con PowerShell y usar las propiedades y métodos agregados de la misma manera que usa las propiedades definidas en los tipos de objeto.
Por ejemplo, PowerShell agrega una propiedad DateTime a todos los objetos, como los que System.DateTime devuelve el Get-Date cmdlet.
(Get-Date).DateTime
Sunday, January 29, 2012 9:43:57 AM
No encontrará la propiedad DateTime en la descripción de la estructura System.DateTime, porque PowerShell agrega la propiedad y solo está visible en PowerShell.
PowerShell define internamente un conjunto predeterminado de tipos extendidos. Esta información de tipo se carga en cada sesión de PowerShell en el inicio. La propiedad DateTime forma parte de este conjunto predeterminado. Antes de PowerShell 6, las definiciones de tipo se almacenaban en el archivo en el Types.ps1xml directorio de instalación de PowerShell ( $PSHOME ).
Adición de datos de tipo extendido a PowerShell
Hay tres orígenes de datos de tipo extendido en sesiones de PowerShell.
PowerShell define los datos de tipo extendido y se cargan automáticamente en cada sesión de PowerShell. A partir de PowerShell 6, esta información se compila en PowerShell y ya no se incluye en un
Types.ps1xmlarchivo.Los
Types.ps1xmlarchivos que exportan los módulos se cargan cuando el módulo se importa en la sesión actual.Los datos de tipo extendido que se definen mediante
Update-TypeDatael cmdlet solo se agregan a la sesión actual. No se guarda en un archivo.
En la sesión, los datos de tipo extendido de los tres orígenes se aplican a los objetos de la misma manera y está disponible en todos los objetos de los tipos especificados.
Cmdlets TypeData
Los cmdlets siguientes se incluyen en el módulo Microsoft.PowerShell.Utility de PowerShell 3.0 y versiones posteriores.
Get-TypeData: obtiene datos de tipo extendido en la sesión actual.Update-TypeData: vuelve a cargarTypes.ps1xmllos archivos. Agrega datos de tipo extendido a la sesión actual.Remove-TypeData: quita los datos de tipo extendido de la sesión actual.
Para obtener más información sobre estos cmdlets, consulte el tema de ayuda de cada cmdlet.
Archivos xml Types.ps1integrados
Los Types.ps1xml archivos del directorio se agregan automáticamente a cada $PSHOME sesión.
El archivo del directorio de instalación de PowerShell ( ) es un archivo de texto basado en XML que permite agregar propiedades y métodos a los objetos que se Types.ps1xml $PSHOME usan en PowerShell. PowerShell tiene archivos integrados que agregan varios elementos a los tipos de .NET, pero puede crear archivos adicionales Types.ps1xml para ampliar aún más los Types.ps1xml tipos.
Por ejemplo, de forma predeterminada, los objetos de matriz ( ) tienen una propiedad Length que enumera System.Array el número de objetos de la matriz. Sin embargo, dado que el nombre Length no describe claramente la propiedad, PowerShell agrega una propiedad de alias denominada Count que muestra el mismo valor. El siguiente XML agrega la propiedad Count al System.Array tipo .
<Type>
<Name>System.Array</Name>
<Members>
<AliasProperty>
<Name>Count</Name>
<ReferencedMemberName>
Length
</ReferencedMemberName>
</AliasProperty>
</Members>
</Type>
Para obtener el nuevo AliasProperty, use un Get-Member comando en cualquier matriz, como se muestra en el ejemplo siguiente.
Get-Member -InputObject (1,2,3,4)
El comando devuelve los siguientes resultados.
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 resultado, puede usar la propiedad Count o la propiedad Length de matrices en PowerShell. Por ejemplo:
(1, 2, 3, 4).count
4
(1, 2, 3, 4).length
4
Creación de nuevos Types.ps1xml
Los .ps1xml archivos que se instalan con PowerShell están firmados digitalmente para evitar alteraciones, ya que el formato puede incluir bloques de script. Por lo tanto, para agregar una propiedad o un método a un tipo de .NET, cree sus propios archivos y, a continuación, agrégrélos a Types.ps1xml la sesión de PowerShell.
Para crear un nuevo archivo, empiece por copiar un archivo Types.ps1xml existente. El nuevo archivo puede tener cualquier nombre, pero debe tener una extensión .ps1xml de nombre de archivo. Puede colocar el nuevo archivo en cualquier directorio accesible para PowerShell, pero resulta útil colocar los archivos en el directorio de instalación de PowerShell ( ) o en un subdirectorio del directorio $PSHOME de instalación.
Cuando haya guardado el nuevo archivo, use el Update-TypeData cmdlet para agregar el nuevo archivo a la sesión de PowerShell. Si desea que los tipos tienen prioridad sobre los tipos integrados que se definen, use el parámetro PrependData del Update-TypeData cmdlet . Update-TypeData solo afecta a la sesión actual. Para realizar el cambio en todas las sesiones futuras, exporte la consola o agregue el Update-TypeData comando al perfil de PowerShell.
Types.ps1xml y Add-Member
Los archivos agregan propiedades y métodos a todas las instancias de los objetos del tipo de .NET especificado Types.ps1xml en la sesión de PowerShell afectada. Sin embargo, si necesita agregar propiedades o métodos solo a una instancia de un objeto, use el Add-Member cmdlet .
Para obtener más información, vea Add-Member.
Ejemplo: Agregar un miembro Age a objetos FileInfo
En este ejemplo se muestra cómo agregar una propiedad Age a objetos System.IO.FileInfo. La antigüedad de un archivo es la diferencia entre su hora de creación y la hora actual en días.
Dado que la propiedad Age se calcula mediante un bloque de script, busque una etiqueta para usarla como modelo para la nueva propiedad <ScriptProperty> Age.
Guarde el código XML siguiente en el archivo $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>
Ejecute Update-TypeData para agregar el nuevo archivo a la sesión Types.ps1xml actual. El comando usa el parámetro PrependData para colocar el nuevo archivo en un orden de precedencia superior a las definiciones originales.
Para obtener más información sobre Update-TypeData , vea Update-TypeData.
Update-Typedata -PrependPath $PSHOME\MyTypes.ps1xml
Para probar el cambio, ejecute un comando para obtener el archivo PowerShell.exe en el directorio y, a continuación, canalizar el archivo al cmdlet para enumerar todas las propiedades Get-ChildItem $PSHOME del Format-List archivo. Como resultado del cambio, la propiedad Age aparece en la lista.
Get-ChildItem $PSHOME\pwsh.exe | Select-Object Age
142
Xml en Types.ps1xml
La definición de esquema completa se puede encontrar en Types.xsd en el repositorio de código fuente de PowerShell en GitHub.
La <Types> etiqueta incluye todos los tipos definidos en el archivo. Solo debe haber una <Types> etiqueta.
Cada tipo de .NET mencionado en el archivo debe representarse mediante una <Type> etiqueta .
Las etiquetas de tipo deben contener las siguientes etiquetas:
<Name>: incluye el nombre del tipo de .NET afectado.
<Members>: incluye las etiquetas de las nuevas propiedades y métodos definidos para el tipo .NET.
Cualquiera de las siguientes etiquetas de miembro puede estar dentro de la <Members> etiqueta .
AliasProperty
Define un nuevo nombre para una propiedad existente.
La etiqueta debe tener una etiqueta que especifique el nombre de la nueva propiedad y una <AliasProperty> etiqueta que especifique la propiedad <Name> <ReferencedMemberName> existente.
Por ejemplo, la propiedad Count alias 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 .NET.
La etiqueta debe tener una etiqueta que especifique el nombre del nuevo método y una etiqueta que especifique el código en el que se <CodeMethod> <Name> define el <CodeReference> método.
Por ejemplo, el método ToString es el nombre de la definición de código 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
Hace referencia a un método estático de una clase .NET.
La etiqueta debe tener una etiqueta que especifique el nombre de la nueva propiedad y una etiqueta que especifique el código en el que <CodeProperty> <Name> se define la <GetCodeReference> propiedad.
Por ejemplo, la propiedad Mode de los objetos es una propiedad de código definida en el System.IO.DirectoryInfo proveedor FileSystem de 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 <MemberSet> etiquetas aparecen dentro de las <Members> etiquetas principales. Las etiquetas deben incluir una etiqueta que rodea el nombre del conjunto de miembros y una etiqueta secundaria que rodea a los miembros <Name> <Members> (propiedades y métodos) del conjunto. Cualquiera de las etiquetas que crean una propiedad (como o ) o un método <NoteProperty> <ScriptProperty> (como <Method> o ) pueden ser miembros del <ScriptMethod> conjunto.
En Types.ps1xml los archivos, la <MemberSet> etiqueta se usa para definir las vistas predeterminadas de los objetos .NET en PowerShell. En este caso, el nombre del conjunto de miembros (el valor dentro de las etiquetas) siempre es <Name> PsStandardMembers y los nombres de las propiedades (el valor de la etiqueta) son uno de los <Name> siguientes:
DefaultDisplayProperty: una propiedad única de un objeto .DefaultDisplayPropertySet: una o varias propiedades de un objeto .DefaultKeyPropertySet: una o varias propiedades clave de un objeto . Una propiedad de clave identifica instancias de valores de propiedad, como el número de identificador de los elementos de un historial de sesiones.
Por ejemplo, el siguiente XML define la presentación predeterminada de los servicios (objetos System.ServiceProcess.ServiceController ) devueltos por el Get-Service cmdlet . Define un conjunto de miembros denominado PsStandardMembers que consta de una propiedad predeterminada establecida 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>: colección de los métodos del objeto .
NoteProperty
Define una propiedad con un valor estático.
La etiqueta debe tener una etiqueta que especifique el nombre de la nueva propiedad y una etiqueta que <NoteProperty> especifique el valor de la <Name> <Value> propiedad.
Por ejemplo, el siguiente XML crea una propiedad Status para objetos System.IO.DirectoryInfo. El valor de la propiedad Status siempre es Correcto.
<Type>
<Name>System.IO.DirectoryInfo</Name>
<Members>
<NoteProperty>
<Name>Status</Name>
<Value>Success</Value>
</NoteProperty>
</Members>
</Type>
PropertySet
Propiedades que toman argumentos y devuelven un valor.
<Properties>: colección de las propiedades del objeto .
<Property>: propiedad del objeto base.
<PropertySet>: define una colección de propiedades del objeto .
La etiqueta debe tener una etiqueta que especifique el nombre del conjunto de propiedades y una <PropertySet> etiqueta que especifique las <Name> <ReferencedProperty> propiedades. Los nombres de las propiedades se incluyen en <Name> la etiqueta .
En Types.ps1xml , <PropertySet> las etiquetas se usan para definir conjuntos de propiedades para la presentación predeterminada de un objeto. Puede identificar las pantallas predeterminadas por el valor PsStandardMembers en la <Name> etiqueta de una <MemberSet> etiqueta.
Por ejemplo, el siguiente XML crea un propertySet denominado DefaultDisplayPropertySet con tres ReferencedProperties.
<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 la salida de un script.
La etiqueta debe tener una etiqueta que especifique el nombre del nuevo método y una etiqueta que incluya el bloque de script que devuelve el <ScriptMethod> <Name> resultado del <Script> método.
Por ejemplo, los métodos y de los objetos de administración ( ) son métodos de script que ConvertToDateTime ConvertFromDateTime usan los System.System.Management.ManagementObject ToDateTime ToDmtfDateTime métodos estáticos y de la System.Management.ManagementDateTimeConverter clase .
<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 la salida de un script.
La etiqueta debe tener una etiqueta que especifique el nombre de la nueva propiedad y una etiqueta que incluya el <ScriptProperty> bloque de script que devuelve el valor de <Name> <GetScriptBlock> propiedad.
Por ejemplo, la propiedad VersionInfo del objeto System.IO.FileInfo es una propiedad de script que resulta del uso de 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, consulte Windows PowerShell Software Development Kit (SDK) .
Update-TypeData
Para cargar los Types.ps1xml archivos en una sesión de PowerShell, ejecute el cmdlet Update-TypeData . Si desea que los tipos del archivo tienen prioridad sobre los tipos del archivo integrado, agregue el Types.ps1xml parámetro PrependData de Update-TypeData . Update-TypeData afecta solo a la sesión actual. Para realizar el cambio en todas las sesiones futuras, exporte la sesión o agregue el Update-TypeData comando al perfil de PowerShell.
Las excepciones que se producen en las propiedades o al agregar propiedades a un Update-TypeData comando no informan de errores a StdErr . Esto es para suprimir las excepciones que se producirían en muchos tipos comunes durante la aplicación del formato y la generación del resultado. Si va a obtener propiedades de .NET, puede evitar la supresión de excepciones mediante la sintaxis de método en su lugar, como se muestra en el ejemplo siguiente:
"hello".get_Length()
Tenga en cuenta que la sintaxis del método solo se puede usar con propiedades de .NET. Las propiedades que se agregan mediante la ejecución del Update-TypeData cmdlet no pueden usar la sintaxis de método.
Firma de un Types.ps1xml
Para proteger a los usuarios Types.ps1xml del archivo, puede firmar el archivo mediante una firma digital. Para obtener más información, vea about_Signing.