在尝试在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表现得像这样?
答案 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
}