3

我正在尝试使用 Add-Member 将元素添加到 Powershell 变量。我可以使用 NoteProperty 添加静态属性,使用 ScriptMethod 添加方法,如下所示:

$variable = New-Object PSObject
$variable | Add-Member NoteProperty Key "Value"
$variable | Add-Member ScriptMethod DoSomething { // code }

现在我坚持这个:

我想添加一个具有 getter 和 setter 的属性,并通过代码块做很多事情。

VBScript 等效项是这样的:

Class MyClass
  Public Property Get Item(name)
    // Code to return the value of Item "name"
  End Property
  Public Property Let Item(name,value)
    // Code to set the value of Item "name" to value "value"
  End Property
End Class

请注意,我需要编写的代码部分不仅仅是设置/获取值,它们比这更复杂(设置其他相关变量、访问外部数据等)。

我没有在 PowerShell 中找到这么简单的东西,最终添加了 2 个脚本方法,GetItem 和 SetItem。

在 PowerShell 中的 PSObject 成员中实现此 get/let 功能的最佳方法是什么?

提前致谢

4

1 回答 1

2

您应该添加-MemberType ScriptProperty并使用-Valueand -SecondValue

# Make an object with the script property MyProperty
$variable = New-Object PSObject

# “internal” value holder
$variable | Add-Member -MemberType NoteProperty _MyProperty -Value 42

# get/set methods
$get = {
    Write-Host "Getting..."
    $this._MyProperty
}
$set = {
    Write-Host "Setting..."
    $this._MyProperty = $args[0]
}

# the script property
$variable | Add-Member -MemberType ScriptProperty MyProperty -Value $get -SecondValue $set

测试:

Write-Host "Original value: $($variable.MyProperty)"
$variable.MyProperty = 123
Write-Host "After assignment: $($variable.MyProperty)"

它打印:

Getting...
Original value: 42
Setting...
Getting...
After assignment: 123

不幸的是,我不知道如何使“受保护/私有”的内部价值持有者像_MyProperty我们示例中的 note 属性一样(或者是否有可能)。

更新:显然这是标题所要求的或多或少的答案。但问题实际上是关于参数化属性,而不仅仅是通过脚本块实现的 get/set 方法。我尝试使用这种类型的属性 ( ParameterizedProperty)Add-Member失败了,可能还不支持。

于 2010-11-15T14:21:48.063 回答