#自定义类型
#简介
PowerShell 的类型系统建立在 .NET 之上,并通过扩展类型系统(ETS)为对象添加类型名、属性和方法。利用类型加速器、类型名和类型数据,可以为普通对象赋予更清晰的语义。
#类型加速器
类型加速器是短名称到 .NET 类型的映射:
[pscustomobject]@{ Name = 'demo' }
[regex]'^[a-z]+$'
[ipaddress]'127.0.0.1'
[datetime]'2026-01-01'
自定义类型加速器需要访问 PowerShell 内部结构,不受官方支持,不建议在生产脚本中使用。
#指定类型名 PSTypeName
PSTypeName 是 [PSCustomObject] 的特殊键,用于设置对象类型名,影响成员解析、格式化和类型数据查找:
$config = [PSCustomObject]@{
PSTypeName = 'My.App.Config'
Name = 'demo'
Enabled = $true
}
$config.PSObject.TypeNames
输出会先列出 My.App.Config,然后是 System.Management.Automation.PSCustomObject 和 System.Object。类型名也可以用作参数约束:
function Show-Config {
param([PSTypeName('My.App.Config')]$Config)
$Config.Name
}
#Update-TypeData
Update-TypeData 可以为指定类型名动态添加成员:
$config = [pscustomobject]@{
PSTypeName = 'My.App.Config'
Name = 'demo'
}
Update-TypeData -TypeName 'My.App.Config' `
-MemberType ScriptProperty `
-MemberName Display `
-Value { "$($this.Name)!" } `
-Force
$config.Display
demo!
常用 -MemberType 还包括 NoteProperty、AliasProperty、ScriptMethod 和 CodeMethod。修改默认只在当前会话有效。
#Types.ps1xml 简介
Types.ps1xml 是用 XML 描述类型扩展的文件,可由模块清单的 TypesToProcess 自动加载,也可以手动加载:
<Types><Type><Name>My.App.Config</Name><Members>
<ScriptProperty>
<Name>Display</Name>
<GetScriptBlock>"$($this.Name)!"</GetScriptBlock>
</ScriptProperty>
</Members></Type></Types>
Update-TypeData -PrependPath ./MyTypes.ps1xml
#扩展类型系统 ETS
ETS 为每个对象维护一条类型名链,类型名从具体到一般排列。PowerShell 按顺序查找类型数据,因此可以只对自定义类型名添加成员,而不影响其他对象。ETS 主要由类型名、适配成员、扩展成员和格式化定义组成。
#注意事项
Update-TypeData的修改默认只影响当前会话,持久化需要写入.ps1xml文件。- 类型名只是元数据,不提供访问控制或安全隔离。
- 加载外部
.ps1xml文件前应确认来源可信。