我有一些帮助函数写入STDOUT以进行日志记录。其中一些函数会向调用者返回一个值,但会返回该函数的整个输出。所以我的问题是如何让我的函数写入STDOUT并向调用者返回一个值而不会使函数调用期间发出的所有STDOUT污染返回值?我正在寻找某种设计模式或最佳实践。
考虑这个脚本:
Function a
{
Write-Output "In Function a"
$a = 4
return $a
}
$b = a
Write-Output "Outside function: `$b is $b"
输出
Outside function: $b is In Function a 4
但我希望输出为:
In Function a
$b is 4
答案 0 :(得分:8)
在PowerShell 中,返回函数内的所有非捕获输出,而不仅仅是return
的参数。来自documentation:
在WindowsPowerShell®中,即使没有包含Return关键字的语句,每个语句的结果也会作为输出返回。
如果函数看起来像这样并不重要:
function Foo {
'foo'
}
或者像这样:
function Foo {
'foo'
return
}
或者像这样:
function Foo {
return 'foo'
}
它将以任何方式返回字符串foo
。
为了防止返回输出,您可以
写信给主持人:
Function a {
Write-Host 'some text'
$a = 4
return $a
}
捕获变量中的输出:
Function a {
$var = Write-Output 'some text'
$a = 4
return $a
}
或将输出重定向到$null
:
Function a {
Write-Output 'some text' | Out-Null
Write-Output 'some text' >$null
$a = 4
return $a
}
答案 1 :(得分:0)
另一种方法:
例如
function bar() {
Write-Information "Hello from bar()"
return 4
}
$($x = bar) 6>&1
Write-Output "in main `$x = $x"
如果您使用的是Powershell的旧版本,并且不能使用Write-Information
,则Write-Verbose
也可以使用相同的方法。在这种情况下,您将重定向为4>&1
。除非您将整个脚本的标准输出重定向到文件中,否则使用verbose会得到难看的黄色/黑色和“ VERBOSE”文本,在这种情况下,将省略VERBOSE:标记。