布尔变量作为Object []返回

时间:2014-02-18 21:40:59

标签: powershell boolean return-value

我有一个返回布尔变量的函数

function test ($param1, $param2)
{
  [boolean]$match=$false;

  <# function logic #>

  return $match
}

当我尝试在变量中捕获函数调用$ retByFunct = testing $ param1 $ param 2

我将$ retByFunct作为对象数组获取。如果我尝试强制$ retByFunct是一个布尔变量,即[boolean] $ retByFunct = testing $ param1 $ param 2,我得到以下错误。

  

无法将值“System.Object []”转换为类型System.Boolean

我在返回之前检查了$ match.GetType()。控制台说它是一个布尔值,所以我很困惑为什么在函数调用后它会被转换为一个Object Array。

我知道某些集合对象会发生这种情况,并且有一个解决方法,但我如何处理变量的情况?

2 个答案:

答案 0 :(得分:6)

正如@mjolinor所说,您需要显示其余的代码。我怀疑它在某处成功输出流上生成输出。 PowerShell函数返回该流上的所有输出,而不仅仅是return关键字的参数。

之间没有区别
function Foo {
  'foo'
}

function Foo {
  'foo'
  return
}

function Foo {
  return 'foo'
}

上述每个函数在调用时都会返回字符串foo

附加输出导致返回的值为数组,例如:

function Foo {
  $v = 'bar'
  Write-Output 'foo'
  return $v
}

此函数返回数组'foo', 'bar'

您可以通过将不需要的输出重定向到$null来抑制不需要的输出:

function Foo {
  $v = 'bar'
  Write-Output 'foo' | Out-Null
  Write-Output 'foo' >$null
  return $v
}

或通过在变量中捕获它:

function Foo {
  $v = 'bar'
  $captured = Write-Output 'foo'
  return $v
}

答案 1 :(得分:1)

返回一些东西##不是PowerShell唯一返回的东西。如果你愿意的话,这是PowerShell的问题之一。成功输出流上的所有输出也将被返回。这就是为什么你有一个从你的函数返回的对象数组。

function test {
  "hello"
  return "world"
}

$mytest=test
$mytest 

尝试上面的代码......你不会只是“世界”而是 “你好” “世界”

$mytest.count
2