是否有在 Powershell 5 类中创建脚本属性的正确方法

Is there a proper way to create a scriptproperty in a Powershell 5 class

提问人:Xavier Plantefève 提问时间:8/24/2016 更新时间:8/29/2016 访问量:1504

问:

在 5 之前的 Powershell 版本中,可以使用 New-Object “随时随地”创建对象,也可以使用 Add-Member 进行扩展。Powershell 5 引入了类,但似乎它们只允许基本属性和方法。有没有适当的方法可以模拟脚本属性(即,一个被视为属性的属性,而不是一种方法,但仍然在旅途中计算)?

由于构造函数中的黑客攻击,以下代码给出了所需的结果。这种黑客攻击可以避免吗?

class fakescriptproperty {
    hidden [datetime] _currenttime() { return ( Get-Date ) }

    fakescriptproperty() {
        Add-Member -InputObject $this -MemberType ScriptProperty `
            -Name currenttime -Value { $this._currenttime() }
    }
}

$test = New-Object -TypeName fakescriptproperty
$test.currenttime
PowerShell 对象

评论

0赞 Deadly-Bagel 8/24/2016
问题是,PSObjects 设计用于 PowerShell 脚本。类更适合在编程中使用。创建类的能力很有帮助,在某些情况下,出于特定原因(例如严格的对象要求和类型)我想自己这样做,但很可能是用于编程的 .NET 类,所以如果您可以添加脚本属性,我会感到惊讶......

答:

0赞 G42 8/24/2016 #1

不确定我是否理解这里的问题。这就是我创建、扩展和访问自定义对象的方式;如果您想要其他东西,请告诉我。

# Creating new object with key/value hashtable
$customObject = New-Object psobject -Property @{key1 = "value" ; key2 = "value2"}

# Adding member to custom object
$customObject | Add-Member -MemberType NoteProperty -Name key3 -Value value3

# This will return value3
$customObject.key3

========================================================================

编辑 - 我不熟悉课程。在 PowerShell 5 中,可以使用 ScriptProperty 成员扩展自定义对象,并指定在旅途中计算的脚本块(无需黑客)。

$test = New-Object psobject
$test | Add-Member -Name currentime -MemberType ScriptProperty -Value {Get-Date}
$test.currentime

可以指定一个处理属性设置的脚本块(在测试时继续运行到 StackOverflowException)-SecondValue

评论

0赞 Xavier Plantefève 8/24/2016
我想使用类,这就是重点。它更强大,更易于阅读和维护。但是我找不到一种方法来模拟 Add-Member 最棘手的成员类型。