我有一个返回布尔变量的函数
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。
我知道某些集合对象会发生这种情况,并且有一个解决方法,但我如何处理变量的情况?
答案 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