在PowerShell中使用VBscript Public Property Set / Get

时间:2010-11-15 12:40:12

标签: powershell cmdlets

我正在尝试使用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 functionnality的最佳方法是什么?

提前致谢

1 个答案:

答案 0 :(得分:2)

您应该添加-MemberType ScriptProperty并使用-Value-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(或者是否可能)。

更新:显然这是标题所要求的答案。但问题实际上是参数化属性,而不仅仅是通过脚本块实现的get / set方法。我尝试将此类属性(ParameterizedProperty)与Add-Member一起使用失败,可能尚未支持。