Reputation: 163
I have a function which is returning a boolean variable
function test ($param1, $param2)
{
[boolean]$match=$false;
<# function logic #>
return $match
}
when I try and catch the function call in a variable $retByFunct=testing $param1 $param 2
I am getting $retByFunct as an Object Array. If I try and force the $retByFunct to be a boolean variable i.e. [boolean] $retByFunct=testing $param1 $param 2, I get the following error.
Cannot convert value "System.Object[]" to type System.Boolean
I checked out $match.GetType() just before returning it. The console says its a boolean, so am confused as to why after function call its getting converted to an Object Array.
I am aware this happens for some collection objects and there is a work around for that, but how do I handle a case for a variable?
Upvotes: 4
Views: 3529
Reputation: 200473
As @mjolinor said, you need to show the rest of your code. I suspect it's generating output on the success output stream somewhere. PowerShell functions return all output on that stream, not just the argument of the return
keyword. From the documentation:
In PowerShell, the results of each statement are returned as output, even without a statement that contains the Return keyword. Languages like C or C# return only the value or values that are specified by the
return
keyword.
There's no difference between
function Foo {
'foo'
}
or
function Foo {
'foo'
return
}
or
function Foo {
return 'foo'
}
Each of the above functions returns the string foo
when called.
Additional output causes the returned value to be an array, e.g.:
function Foo {
$v = 'bar'
Write-Output 'foo'
return $v
}
This function returns an array 'foo', 'bar'
.
You can suppress undesired output by redirecting it to $null
:
function Foo {
$v = 'bar'
Write-Output 'foo' | Out-Null
Write-Output 'foo' >$null
return $v
}
or by capturing it in a variable:
function Foo {
$v = 'bar'
$captured = Write-Output 'foo'
return $v
}
Upvotes: 8
Reputation: 6615
return something ## is not the only thing that PowerShell returns. This is one of the gotchas of PowerShell, if you will. All output on the success output stream will also be returned. that's why you have an array of objects returning from your function.
function test {
"hello"
return "world"
}
$mytest=test
$mytest
try the code above... you will not get just "world" but "hello" "world"
$mytest.count
2
Upvotes: 4