I am trying to create a function that creates a custom object but have encountered unusual behavior. If you run the below code, you'll find this output
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
Program Output:
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[]
Does anyone know why the returned object is System.Object[] instead of PSCustomObject?
PowerShell returns everything that is not assigned to variable from function and not only statement after return keyword.
In your code it will also add result of this calls:
$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
to function return.
To avoid this you can replace this lines with code (just adding [void] cast of call result):
[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)
after that it will work as expected.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With