如何将函数返回值输出给调用者而不是输出到控制台?

5

假设我有这个简单的PowerShell函数:

function testit() {
    return $true > $null
}

Write-Host "testing"
$thistest = testit 
Write-Host "value = $thistest"

当我在PowerShell脚本中使用它时,我希望在脚本中接收该值,但不想在控制台中显示它。
如何将返回值保留在管道中,但只隐藏它不显示在控制台中?
如果我使用> $null,则会完全抑制输出 - 我只是不想在控制台中显示它,但仍然需要该值。

2
return $true 或者只是 $true 有什么问题? - user4003407
我不明白你在问什么,它通常不会在控制台中显示。function test { $true }; $x = test没有屏幕输出,并将返回值保留在$x中。 - TessellatingHeckler
1
只有在调用函数时才会执行该操作。我不希望 return $true 在控制台中显示为 True - bgmCoder
1个回答

7
作为已记录的PowerShell函数将所有未捕获的输出返回给调用者。如果调用者不对返回值做任何处理,PowerShell会自动将其传递给Out-Default,然后将其转发到Out-Host(请参见Don Jones撰写的本文)。
在函数内部对返回值使用重定向运算符可以有效地抑制返回值,使函数不返回任何内容。
如果您有一个像这样的函数:
function testit {
    return $true
}

并单独调用它:

testit

PowerShell隐式地执行此操作:

testit | Out-Default

这实际上变成了

testit | Out-Host

如果您将返回值捕获到变量中
$thistest = testit

变量中存储了值,但控制台上没有任何内容显示。
如果将输出重定向或将其管道传输到 Out-Null 中。
testit >$null
testit | Out-Null

返回值被丢弃,控制台上没有任何显示。

如果你想防止PowerShell默认的行为,即将未捕获的输出传递到管道末尾的Out-Host,你可以通过像这样覆盖Out-Default来实现:

filter Out-Default { $_ | Out-Null }

或者(正如@PetSerAl在评论中指出的那样)像这样:
filter Out-Default {}

然而,需要注意的是,此修改会在当前范围内禁用Out-Default,直到您再次删除过滤器。例如,如果在过滤器处于活动状态时执行 Get-ChildItem,除非您明确将输出写入主机控制台,否则不会显示任何内容:

Get-ChildItem | Out-Host

你可以这样移除过滤器:
Remove-Item function:Out-Default

多好的回答!正是我需要和想要的。谢谢。 - bgmCoder
1
为什么你要将 $_ 管道传输到 Out-Null 而不是什么都不做(function Out-Default { })? - user4003407
1
@PetSerAl 因为我没有意识到那也可以起作用。感谢您指出,我更新了我的答案。 - Ansgar Wiechers
所以,除非从另一个函数中调用它,否则没有办法使其向调用者返回一个值,但不输出到控制台吗? - bgmCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接