wga*_*ate 2 powershell powershell-2.0
我正在尝试创建一个创建自定义对象但遇到异常行为的函数.如果您运行以下代码,您将找到此输出
function Test-CustomObject {
function Create-CustomObject {
$objProps = @{
'property1' = 'Hello from property 1';
'property2' = 'Hello from property 2';
}
$obj = New-Object -TypeName PSCustomObject -Prop $objProps
$obj | Add-Member -MemberType ScriptMethod -Value { return 'Hello from method 1' } -Name Method1 -PassThru
$obj | Add-Member -MemberType ScriptMethod -Value { return 'Hello from method 2' } -Name Method2 -PassThru
write-host "in function: $obj"
write-host "in function type: $($obj.GetType())"
return $obj
}
$newObj = Create-CustomObject
write-host "after function: $newObj"
write-host "after function type: $($newObj.GetType())"
}
Test-CustomObject
Run Code Online (Sandbox Code Playgroud)
节目输出:
in function: @{property1=Hello from property 1; property2=Hello from property 2}
in function type: System.Management.Automation.PSCustomObject
after function:
after function type: System.Object[]
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么返回的对象是System.Object []而不是PSCustomObject?
PowerShell返回未从函数赋值给变量的所有内容,而不仅仅返回return关键字后的语句.
在您的代码中,它还将添加此调用的结果:
$obj | Add-Member -MemberType ScriptMethod -Value { return 'Hello from method 1' } -Name Method1 -PassThru
$obj | Add-Member -MemberType ScriptMethod -Value { return 'Hello from method 2' } -Name Method2 -PassThru
Run Code Online (Sandbox Code Playgroud)
功能返回.
为了避免这种情况,你可以用代码替换这一行(只需添加调用结果的[void] cast):
[void]($obj | Add-Member -MemberType ScriptMethod -Value { return 'Hello from method 1' } -Name Method1 -PassThru)
[void]($obj | Add-Member -MemberType ScriptMethod -Value { return 'Hello from method 2' } -Name Method2 -PassThru)
Run Code Online (Sandbox Code Playgroud)
之后它将按预期工作.
| 归档时间: |
|
| 查看次数: |
5544 次 |
| 最近记录: |