user3325210
user3325210

Reputation: 163

Boolean variable gets returned as an Object[]

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

Answers (2)

Ansgar Wiechers
Ansgar Wiechers

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

Adil Hindistan
Adil Hindistan

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

Related Questions