定义新的或重新定义系统对象的自定义方法

时间:2018-10-13 12:32:37

标签: powershell

朋友,如何定义系统对象的新自定义方法或重新定义现有方法?

# Example of using Add-Member cmdlet:
Add-Member -InputObject [System.Array] -MemberType "ScriptMethod" -Name "joinSpaces" -Value {return $This -join " "}

# Check the method added:
[System.Array]::joinSpaces -eq $Null  #=> True
[System.Array].joinSpaces -eq $Null  #=> True
("a", "b").joinSpaces -eq $Null  #=> True

2 个答案:

答案 0 :(得分:2)

要在 type 级别而不是 instance 级别定义新成员,必须使用Update-TypeData 而不是{ {1}}:

Add-Member

要强制进行重新定义,请附加Update-TypeData -TypeName System.Array -MemberType ScriptMethod -MemberName JoinSpaces ` -Value { $this -join ' ' }

这使得该方法可用于类型-Force的所有将来的实例

要查看实际效果:

[System.Array]

关于您尝试过的事情

通过将PS> ('one', 'two').JoinSpaces() one two 传递给[System.Array],您传递了字符串文字 -InputObject,而不是数组 type ,因为在参数解析模式,以'[System.Array]'开头的令牌被解释为字符串,而不是表达式。

要传递 type ,您必须使用[-注意-InputObject ([System.Array])-但这会将(...)方法附加到对象代表类型本身 ,而不是该类型的所有实例

换句话说,您将能够执行以下操作,尽管这没什么用:

joinSpaces()

答案 1 :(得分:-1)

这里是一个例子:

[PSCustomObject]$PSCustomObject = @{Name='MyPSCustomObject';DataSet=@()}

Add-Member -InputObject $PSCustomObject -MemberType 'ScriptMethod' -Name 'JoinSpaces' -Value {return $This.DataSet -join ' '} -PassThru

$PSCustomObject.DataSet = 'a','b','c','d','e'

$PSCustomObject.JoinSpaces()

输出:

a b c d e