如何将值从函数输出到调用者而不是控制台

时间:2017-01-04 23:56:55

标签: function powershell

假设我有这个简单的PowerShell功能:

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

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

当我在PowerShell脚本中使用它时,我希望在脚本中收到值,但我不希望它在控制台中显示。

如何将返回值保留在管道中,只是将其隐藏在控制台中?

如果我使用> $null那么它会完全抑制输出 - 我只是希望它不会在控制台中显示,但我仍然想要这个值。

1 个答案:

答案 0 :(得分:5)

作为documented PowerShell函数将所有未捕获的输出返回给调用者。如果调用者没有对返回值执行任何操作,PowerShell会自动将其传递给Out-DefaultOut-Host会将其转发到this article(请参阅Don Jones撰写的https://bugs.php.net/bug.php?id=69224)。

在函数内部的返回值上使用重定向运算符可以有效地抑制返回值,这样函数就不会返回任何内容。

如果你有这样的功能:

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