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

bgm*_*der 1 powershell function

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

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

Write-Host "testing"
$thistest = testit 
Write-Host "value = $thistest"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ans*_*ers 6

作为记录 PowerShell函数返回的所有非捕获输出给调用者.如果调用者没有对返回值执行任何操作,PowerShell会自动将其传递给Out-Default,然后将其转发给Out-Host(请参阅Don Jones撰写的这篇文章).

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

如果你有这样的功能:

function testit {
    return $true
}
Run Code Online (Sandbox Code Playgroud)

并自己调用它:

testit
Run Code Online (Sandbox Code Playgroud)

PowerShell隐式执行此操作:

testit | Out-Default
Run Code Online (Sandbox Code Playgroud)

这实际上变成了

testit | Out-Host
Run Code Online (Sandbox Code Playgroud)

如果捕获变量中的返回值

$thistest = testit
Run Code Online (Sandbox Code Playgroud)

值存储在变量中,而控制台上没有显示任何内容.

如果您重定向输出或管道输入 Out-Null

testit >$null
testit | Out-Null
Run Code Online (Sandbox Code Playgroud)

返回值被丢弃,控制台上不显示任何内容.

如果要阻止PowerShell在管道末尾传递未捕获的输出的默认行为,Out-Host可以通过覆盖Out-Default这样做来实现:

filter Out-Default { $_ | Out-Null }
Run Code Online (Sandbox Code Playgroud)

或者(正如@PetSerAl在评论中指出的)像这样:

filter Out-Default {}
Run Code Online (Sandbox Code Playgroud)

但是,请注意,此修改将禁用Out-Default当前作用域中的所有内容,直到再次删除过滤器为止.如果你做了一段Get-ChildItem时间过滤器处于活动状态,除非你明确地将输出写入主机控制台,否则不会显示任何内容:

Get-ChildItem | Out-Host
Run Code Online (Sandbox Code Playgroud)

你删除这样的过滤器:

Remove-Item function:Out-Default
Run Code Online (Sandbox Code Playgroud)