2014-01-20 5 views
2

У меня есть вспомогательные функции, которые записываются в STDOUT для ведения журнала. Некоторые из этих функций возвращают значение вызывающему, но возвращается весь вывод функции. Поэтому мой вопрос заключается в том, как мои функции записывать в 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 

ответ

4

В PowerShell все не захваченное выход внутри возвращается функция, а не только аргумент return. Из documentation:

В Windows PowerShell ®, результаты каждого оператора возвращаются как выход, даже без заявления, содержащего ключевое слово 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 
    } 
    
Смежные вопросы