从写入STDOUT的函数返回值的最佳方法是什么?

时间:2014-01-20 10:52:45

标签: function powershell powershell-v2.0

我有一些帮助函数写入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

2 个答案:

答案 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)

另一种方法:

  1. 在您的函数中,通过Write-Information进行日志记录。
  2. 在调用范围内,在子表达式内调用该函数,并将该子表达式的信息流重定向到stdout。确保将函数的返回值分配给变量,否则它也将进入stdout。

例如

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:标记。