PowerShell:如何在同一对象内从一个对象属性引用另一个对象属性?

3

晚上好,小问题请教一下,如果可以的话。

我知道可以通过将其调用为空对象,然后逐个添加属性来实现。

$Obj = New-Object PSObject
$Obj.name = “hello”
$Obj.type = $Obj.name ‘+’ “world”

有没有一种方法可以将此作为一个属性行来完成?
$Obj = New-Object PSObject -Property @{
Name = “hello”
Type = $Obj.name ‘+’ “world”
}

你可以使用类来实现,但你想要解决的问题是什么?在你的例子中,为什么不直接使用 Type = 'hello' + 'world' 呢? - Santiago Squarzon
这主要是出于好奇心。具体来说,我有一个对象,在其中将安装程序定义为获取文件夹中最新的文件。然后,我提取安装程序版本,而不是再次复制该属性的代码,我想只引用该属性。 - Fitzgery
你可以使用类来实现,但它看起来不会像你所拥有的那样。参数只能是你用于 name 的内容。 - Santiago Squarzon
2个回答

4

这可能会帮助您使用PowerShell class实现您正在寻找的内容:

  • 定义
class SomeClass {
    [string] $Name
    [string] $Type

    SomeClass() { }
    SomeClass([string] $Name, [string] $Type) {
        # ctor for custom Type
        $this.Name = $Name
        $this.Type = $Type
    }

    static [SomeClass] op_Explicit([string] $Name) {
        # explicit cast using only `Name`
        return [SomeClass]::new($Name, $Name + 'World')
    }
}

现在你可以使用自定义的值来实例化 Type:

PS ..\> [SomeClass]@{ Name = 'hello'; Type = 'myCustomType' }

Name  Type
----  ----
hello myCustomType

或者让显式转换运算符根据Name参数处理Type属性的预定义值:

PS ..\> [SomeClass] 'hello'

Name  Type
----  ----
hello helloWorld

1
谢谢提供的信息!还有一些东西需要我去了解一下。非常感谢! - Fitzgery

4

Santiago Squarzon提供了一个有用的答案,通过定义一个class来创建一个专门的.NET类型来解决您的问题。

然而,您可以使用以下解决方法避免创建一个专门的.NET类,该方法使用辅助变量以及将变量赋值包含在(...)中传递赋值的值通过的事实:

$obj = [pscustomobject] @{
  Name = ($name = 'hello')  # assign 'hello' to $name and pass the value through
  Type = $name + 'world'    # use the value assigned to $name above
}

注意:这依赖于属性定义的顺序: 派生属性值必须放在定义辅助变量的属性值后面
$obj输出到显示器上会打印:
Name  Type
----  ----
hello helloworld

参见:

  • GitHub问题#13782,该问题要求在哈希表内部交叉引用条目的内置机制,同样适用于自定义对象字面量。

1
非常感谢!这是一个伟大而简单的解决方法,易于维护 :-) - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接