约 2164 字

约 11 分钟

#自定义类型

#简介

PowerShell 的类型系统建立在 .NET 之上,并通过扩展类型系统(ETS)为对象添加类型名、属性和方法。利用类型加速器、类型名和类型数据,可以为普通对象赋予更清晰的语义。

#类型加速器

类型加速器是短名称到 .NET 类型的映射:

[pscustomobject]@{ Name = 'demo' }
[regex]'^[a-z]+$'
[ipaddress]'127.0.0.1'
[datetime]'2026-01-01'

#指定类型名 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 文件前应确认来源可信。

#推荐阅读

更新: 2026/11/2

作者: planc

创建: 2026/11/2