如何在Powershell中为自定义对象创建自定义方法和项?

时间:2018-08-02 17:56:51

标签: powershell

我正在尝试在Powershell中使用自定义方法和该方法内部的键值对创建一个自定义对象。

$mymethod= @{
MemberName = "mymethod"
MemberType = 'ScriptMethod'
Value = {'Test'}
Force = $true
}
Update-TypeData -TypeName 'Dummy' @mymethod
$test = [PsCustomObject][Ordered]@{PsTypeName = 'Dummy'}

因此,这创建了对象 $ test.mymethod()的值为“ Test”

我正在尝试如下创建:

    $test.mymethod('key1')='value1'
    $test.mymethod('key2')='value2'

有帮助吗?

2 个答案:

答案 0 :(得分:2)

一般性地回答问题(即使特定用例可能需要更简单的解决方案,如TheIncorrigible1's answer所示):

注意:在下面的代码中,我假设$test.mymethod('key1')='value1'实际上是想让您$test.mymethod('key1')返回 'value1' ,因为使用方法调用作为赋值的LHS没有意义。


lit提到了 PSv5 +替代方案:定义[class]

# Define the class.
class Dummy { 
 [string] mymethod([string] $key) { return @{ key1='value1'; key2='value2' }[$key] }
}

# Instantiate it
$test = [Dummy]::new()

# Call the method
$test.mymethod('key2') # -> 'value2'

如果您确实要使用PowerShell's ETS (extended type system)(如您的问题)(这是PSv4-中的唯一选项,缺少通过Add-Type嵌入的C#代码):

也许唯一的障碍是不知道如何为该方法定义一个参数(使用param()块)以及如何访问在其上调用该方法的实例(使用$this);两种技术如下所示:

# Define a type named 'Dummy' and attach a script method named 'mymethod'
$mymethod = @{
  MemberName = 'mymethod'
  MemberType = 'ScriptMethod'
  # Note the use of param() to define the method parameter and
  # the use of $this to access the instance at hand.
  Value      = { param([string] $key) $this.Dict[$key] }
  Force      = $true
}
Update-TypeData -TypeName 'Dummy' @mymethod

# Create a custom object and give it an ETS type name of 'Dummy', which
# makes the mymethod() method available.
$test = [PsCustomObject] @{ PsTypeName = 'Dummy'; Dict = @{ key1='value1'; key2='value2' } } 

$test.mymethod('key2')  # -> 'value2'

答案 1 :(得分:1)

要扩展@Ansgar Wiechers的评论,听起来您正在尝试重新创建字典,.NET的字典很多:

$test = [pscustomobject]@{
    bar = [ordered]@{
    }
}

实际情况:

$test.bar.Add('key1', 'value1')
$test.bar.Add('key2', 'value2')

输出:

> $test
>> bar
>> ---
>> {key1, key2}

> $test.bar
>> Name    Value
>> ----    -----
>> key1    value1
>> key2    value2