在尝试在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(( 的调用从包装对象而不是嵌入式自定义对象返回"Test"属性值。为什么Powershell会这样?
我怀疑这里的问题(基于sleep 5
的假设意图(是$oCustom
被分配了一个自定义对象,然后在 5 秒后$oWrapper
被分配了一个包装对象,其中包含一个新的自定义对象,该对象具有基本相同的[DateTime]
值(到最接近的秒(,而不是(预期的? (先前创建的$oCustom
。 WrapTest()
返回的不是$oWrapper
的Test
成员,而是返回其自己的自定义对象在$oWrapper.Object
中无法区分的Test
成员。为了创建一个(通用(包装器对象,你需要一些东西来包装,否则它实际上只是一个(特定的(嵌套对象。像这样:
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
}
对于(假设是(期望的结果:
$oCustom = Create-Custom-Object
sleep 5
$oWrapper = Create-Wrapper-Object $oCustom
echo "Custom-Test: $($oCustom.Test)"
Custom-Test: 05/31/2021 08:52:30
echo "Wrapper-Test: $($oWrapper.Test)"
Wrapper-Test: 05/31/2021 08:52:35
echo "GetTest: $($oCustom.GetTest())"
GetTest: 05/31/2021 08:52:30
echo "WrapTest: $($oWrapper.WrapTest())"
WrapTest: 05/31/2021 08:52:30