$ Powershell中嵌套自定义对象的$ this对象引用

时间:2017-11-20 08:24:01

标签: powershell scripting

在尝试在Powershell中进行对象引用时,我似乎无法理解这些东西。不确定是否有我错过的东西。

说明此问题的示例代码如下:

function Create-Custom-Object {

    $oResult = New-Object -TypeName PSObject -Property (@{
        "Test"          = $(Get-Date);
    })

    Add-Member -memberType ScriptMethod -InputObject $oResult -Name "GetTest" -Value {
        return $this.Test;
    }

    return $oResult
}

function Create-Wrapper-Object {

    $oObject = $(Create-Custom-Object)

    $oResult = New-Object -TypeName PSObject -Property (@{
        "Object"             = $oObject;
        "Test"               = $(Get-Date);
    })

    Add-Member -MemberType ScriptMethod -InputObject $oResult -Name "WrapTest" -Value {
        return $this.Object.GetTest()
    }

    return $oResult

}

$oCustom = Create-Custom-Object
sleep 5
$oWrapper = Create-Wrapper-Object
echo "Custom-Test: $($oCustom.Test)"
echo "Wrapper-Test: $($oWrapper.Test)"
echo "GetTest: $($oCustom.GetTest())"
echo "WrapTest: $($oWrapper.WrapTest())"

运行时,输出如下:

>powershell -file test.ps1
Custom-Test: 11/20/2017 16:10:19
Wrapper-Test: 11/20/2017 16:10:24
GetTest: 11/20/2017 16:10:19
WrapTest: 11/20/2017 16:10:24

困惑的是,对包装器对象的WrapTest()调用返回"测试"包装器对象的属性值而不是嵌入的自定义对象。为什么Powershell表现得像这样?

1 个答案:

答案 0 :(得分:0)

我怀疑这里的问题(基于 sleep 5 的假定意图)是 $oCustom 被分配了一个 Custom-Object,然后 5 秒后 {{ 1}} 被分配了一个 Wrapper-Object,其中包含一个 new Custom-Object 具有基本相同的 $oWrapper 值(到最近的秒),而不是(预期的?)先前创建的 [DateTime]$oCustom 不返回 WrapTest()Test 成员,而是返回 $oWrapper 中其自身 Custom-Object 的不可区分的 Test 成员。为了创建一个(通用的)包装对象,你需要包装一些东西,否则它实际上只是一个(特定的)嵌套对象。像这样:

$oWrapper.Object

有了(假设是)想要的结果:

function Create-Wrapper-Object {
param ($ObjectToWrap)

  $oResult = New-Object -TypeName PSObject -Property (@{
    "Object"             = $ObjectToWrap; # presumably with a GetTest() method
    "Test"               = $(Get-Date);   # remember the time of wrapping
  })

  Add-Member -MemberType ScriptMethod -InputObject $oResult -Name "WrapTest" -Value {
    return $this.Object.GetTest()
  }
  return $oResult
}