如何使用Powershell函数返回期望值?

时间:2018-09-11 10:32:26

标签: powershell

我们知道,PowerShell具有古怪的返回语义。

Function return value in PowerShell显示了两个主要想法供您参考:

  • 捕获所有输出并返回
  • return关键字仅指示逻辑出口点

即使在外部范围中保留变量之类的内容也会导致输出,例如[boolean]$isEnabled。另一个不错的是$someCollection.Add("toto"),它会吐出新的收集计数。甚至Append()函数也会导致输出。

例如:

Function MyFunc {
        $res1 = new-object System.Text.StringBuilder
        $res1.Append("titi");
        $res2 = "toto"

        return $res2
}

$s = MyFunc
Write-Host $s

输出为:titi toto

预期输出应为toto

如何使用Powershell函数返回期望值? (至少从更传统的编程角度来看)

3 个答案:

答案 0 :(得分:1)

更改

$res1.Append("titi");

$res1.Append("titi") | Out-Null

因为该函数返回所有输出,否则将在控制台中显示该输出。

答案 1 :(得分:0)

如果使用“ toto”来尝试了解功能是否成功,则可以

Function MyFunc {
    $res1 = new-object System.Text.StringBuilder
    $res1.Append("titi") | Out-Null
    return $?
}

“ $?”如果前一个命令成功(true)或失败(false),则返回一个布尔值。所以从外观上看

$s = MyFunc
if ($s) {
    Write-Host "successful" -Foregroundcolor Green
}
else {
    Write-Error "unsuccessful"
}

答案 2 :(得分:0)

在开发PowerShell时,团队希望使其易于使用。但是,这使其他语言的人return感到困惑。在类中的实现是为了纠正该错误。

return关键字在PowerShell类中的方法中的工作方式非常不同。它的工作方式类似于其他语言的return语句。

在类方法中,return关键字:

  • 退出当前范围。
  • 返回关联的对象(r​​eturn)。
  • 仅返回关联的对象。
  • Return返回的对象必须与方法的返回类型匹配。

它与return关键字和其他语言中的类似关键字一致。

class ClassMyFunc
{
    [string] MyFunc
    {
        $res1 = new-object System.Text.StringBuilder
        $res1.Append("titi")
        $res2 = "toto"

        return $res2
    }
}

$cmf = New-Object -TypeName ClassMyFunc
$cmf.MyFunc()

输出如预期的那样:toto。 使用类可以解决我的问题,而不必搜索所有在控制台中返回值的函数并将其通过管道传递到Out-Null(如@TobyU的建议)。