从多个返回值中进行选择

时间:2015-05-26 20:25:59

标签: powershell scripting

当我有一个使用多个Write-Output命令并返回单个数字的函数时,如何在函数调用者代码中获取数值? 就我而言,行

[int] $var = Get-MyNumber(...)

给我带来错误

  

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

可能是因为PowerShell将一个对象数组(包含Write-Output个消息)返回给调用者代码,其中对[int] - 类型变量的赋值失败。得到了。

现在,我如何告诉PowerShell我只对函数返回的单个值感兴趣,该函数的类型为[int]

顺便说一句,我不想​​通过索引返回数组来选择输出,因为我只需添加另一行Write-Output就可以搞乱返回数组中的索引。 (由于代码维护,迟早会发生这种情况)。

代码

function f1() {
    Write-Output "Lala"
    return 5
}

[int] $x = f1
Write-Output $x

导致同样的错误。

1 个答案:

答案 0 :(得分:2)

我从您的编辑中看到您正在使用Write-Output来显示状态消息。

您应该使用Write-Host,或者如果您使用的是advanced function,我建议您使用Write-Verbose并在想要查看时使用-Verbose调用该功能消息(见about_CommonParameters)。

更新的代码:

function f1() {
    Write-Host "Lala"
    return 5
}

[int] $x = f1
Write-Host $x

高级功能示例

function f1 {
[CmdletBinding()]
param()

    Write-Verbose "Lala"
    return 5
}

$x = f1
# The "Lala" message will not be seen.

$x = f1 -Verbose
# The "Lala" message will be seen.

为什么Write-Output似乎在函数之外工作:

Write-Output将输入对象传递给调用者。如果代码直接在主机中执行,而不是在函数或cmdlet中执行,则调用者是主机,主机决定如何处理它。对于powershell.exe(或ISE),它会显示它。

另一方面,

Write-Host总是写入主机;它不会将任何内容传递给调用者。

另请注意,Write-Output基本上是可选的。以下几行是等效的:

Write-Output $x
$x