在PowerShell中,您可以扩展对象:
使用Add-Member cmdlet可以将成员(属性和方法)添加到Windows PowerShell对象的实例。 例如,您可以添加一个NoteProperty成员,该成员包含对象的描述或运行脚本以更改对象的ScriptMethod成员。
但是:
您添加的属性和方法仅添加到您指定的对象的特定实例。 添加成员不会更改对象types。 要创build新的对象types,请使用Add-Type cmdlet …
例如:
$s = "Hello World" | Add-Member -PassThru ScriptProperty Reverse {$this[$this.Length..0] -join ""} $s Hello World $s.Reverse dlroW olleH
是否有一种简单的直接方式来为所有这种types的实例做同样的事情,就像C#中的扩展方法一样,它会做类似于以下的事情:
$s = "Hello World" | Add-Member -PassThru ScriptProperty Reverse {$this[$this.Length..0] -join ""} $s Hello World $s.Reverse dlroW olleH $a = "Aymen" $a.Reverse nemyA
这并不是一个简单的方法,但可以通过修改目标类型的类型数据来完成。 这需要Get-TypeData
/ Update-TypeData
cmdlet。 Add-Member
无法完成。 下面是将一个属性添加到DateTime的示例, UtcSeconds
是自UTC时区1/1/1970以来的秒数。 您还可以添加其他成员,例如方法,别名或注释属性。
$td = Get-TypeData System.DateTime $scriptBlock = { ([System.TimeZoneInfo]::ConvertTimeToUtc($this) - (new-object System.DateTime 1970,1,1,0,0,0,0,"Utc")).TotalSeconds } $scriptProperty = new-object System.Management.Automation.Runspaces.ScriptPropertyData "UtcSeconds", $scriptBlock $td.Members.Add("UtcSeconds", $scriptProperty) Update-TypeData $td -Force
请注意,如果您正在编写模块,则可以通过types.ps1xml文件更方便地扩展现有类型。