朋友,如何定义系统对象的新自定义方法或重新定义现有方法?
# 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
答案 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