我们知道,PowerShell具有古怪的返回语义。
Function return value in PowerShell显示了两个主要想法供您参考:
即使在外部范围中保留变量之类的内容也会导致输出,例如[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函数返回期望值? (至少从更传统的编程角度来看)
答案 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
关键字:
它与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的建议)。